use formal model selection to actually select the best thermal performance model (i.e., instead of the current “I like this because it looks pretty” method).
estimate the so-called “temperature optimum” for each species.
for TTD data, compare linear vs non-linear fits to see if it’s possible to detect lag time. x calibrate the plate reader to CFU’s so that I can convert from OD to number of cells.
Once I’ve done that, check the threshold of detection against all the cultures to see if there’s any where we inoculated above the threshold of detection. If there are, check those curves directly for a lag.
In general, I expect TTD estimated \(\mu\) \(>\) per capita derivatives. BUT!, TTD can underestimate growth rate when there’s a lag time. It would be good to compare the confidence intervals between TTD method and per capita derivative (e.g., at 0.05) to get an idea of when lag is happening as a function of temperature.
finally, for the \(\alpha_{ii}\) effect: it would be good to plot the temperature optimum on the plot to see if
This notebook is for analyzing the temperature growth curves data produced by Anjaney. The goal is to describe the thermal niche of different strains present in the TERR lab. Two main questions of the experiment are:
Is there a relationship between a strain’s growth (fast VS slow grower) and its thermal niche?
How does the growth stage of a culture (exponential VS stationary) impact its resistance to extreme heat?
Briefly, the data consists of growth curves inoculated in a 10-fold serial dilution at 6 different starting concentrations (\(N_0\)). There are 12 strains in total (BSC001 through BSC010 and BSC015, BSC019). Each inoculum was grown at 28C then its OD was adjusted and growth curves were acquired at 4 different temperatures (25C, 30C, 35C, 40C) in 3 replicates (i.e., each replicate grown on a different day). Finally, each strain was inoculated either from early exponential phase or from stationary phase.
This is a quick analysis of the data that uses a coarse-grained approximation of the time-to-detection (TTD) as a proxy of a strain’s growth. Note that TTD is inversely related to growth rate: a fast growing strain will have a shorter TTD and a slow growing strain will have a longer TTD.
First load the packages and define a consistent theme for plotting.
# load packages
source("H1_extract_data_fun_v3-1.R") # for getting the data into R from the default H1 txt export format
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tidyverse)
library(readxl) # for importing data directly from Excel sheet
library(rTPC) # for fitting thermal performance curves
library(nls.multstart) # used with rTPC to find the best fitting model
library(broom)
library(Hmisc) # for calculating non-parametric bootstrap confidence intervals
##
## Attaching package: 'Hmisc'
##
## The following objects are masked from 'package:dplyr':
##
## src, summarize
##
## The following objects are masked from 'package:base':
##
## format.pval, units
library(AICcmodavg) # AIC comparison for survival CFU data
library(RColorBrewer) # for changing the colours of plots
library(gcplyr) # for getting the derivatives of growth curve data
## ##
## ## gcplyr (Version 1.10.0, Build Date: 2024-07-09)
## ## See http://github.com/mikeblazanin/gcplyr for additional documentation
## ## Please cite software as:
## ## Blazanin, Michael. gcplyr: an R package for microbial growth
## ## curve data analysis. BMC Bioinformatics 25, 232 (2024).
## ## https://doi.org/10.1186/s12859-024-05817-3
## ##
library(splines) # for fitting splines to the derivatives
library(glmmTMB) # for fitting linear mixed models
library(emmeans) # for estimated marginal means & analysis-of-variance-like p-values on linear models
## Welcome to emmeans.
## Caution: You lose important information if you filter this package's results.
## See '? untidy'
library(effsize) # for post-hoc statistical test of effect sizes
library(performance) # to get R^2 by comparing 2 different models
# set theme for all plots
fave_theme <- theme_light() + # see other options at https://ggplot2.tidyverse.org/reference/ggtheme.html
theme(text = element_text(size=15), # larger text size for titles & axes
panel.grid.major = element_blank(), # remove major gridlines
panel.grid.minor = element_blank()) # remove minor gridlines
theme_set(fave_theme)
# define a palette for plotting the 4 species
sp_palette = brewer.pal(11, "Set1")[c(1, 3, 7, 4, 2, 5)] # this matches with the slide colours
## Warning in brewer.pal(11, "Set1"): n too large, allowed maximum for palette Set1 is 9
## Returning the palette you asked for with that many colors
Now load the data using the function get_ODdata_block
defined in “H1_extract_data_fun_v3-1.R”. Note that pairs of replicate
plates that were run on the same day (i.e., “blocks”) can be loaded
together in the same function call with the date as the block ID. The OD
data for each well is loaded. Also, the temperature measured at each
time-point by the instrument is given as the mean over the entire growth
curve rounded to the nearest integer.
Note about data: the data must be exported from the software as text file (tab separated values). Select export of raw data only (NOT processed data). If you stopped the machine prior to the total run time of the program, this will generate a bunch of zero time values at the end of the file. This is okay; it will not impact the loading of the data as the trailing zeros will be ignored.
Exclusion of contaminated wells: make sure that you exclude any contaminated wells from the data BEFORE exporting to text file. You will have to do this by noting which wells have unexpected results in the fluorescent scans performed at the end of the growth curves. Then delete the data for those wells.
# this function runs with some warnings. Hermina looked over the resultant data.frame and it seems fine. Will fix this if they find some time...
# load the data
# list.files(pattern = 'C\\.txt$')
# Exponential Phase Inoculum
EX1raw_data.df <- get_ODdata_block(blockID = "2023-10-30",
filename_1 = "2023-10-30_12strains_30C.txt",
filename_2 = "2023-10-30_12strains_40C.txt")
EX2raw_data.df <- get_ODdata_block(blockID = "2023-11-01",
filename_1 = "2023-11-01_12strains_25C.txt",
filename_2 = "2023-11-01_12strains_35C.txt")
EX3raw_data.df <- get_ODdata_block(blockID = "2023-11-03",
filename_1 = "2023-11-03_12strains_30C.txt",
filename_2 = "2023-11-03_12strains_40C.txt")
EX4raw_data.df <- get_ODdata_block(blockID = "2023-11-06",
filename_1 = "2023-11-06_12strains_25C.txt",
filename_2 = "2023-11-06_12strains_35C.txt")
EX5raw_data.df <- get_ODdata_block(blockID = "2023-11-08",
filename_1 = "2023-11-08_12strains_30C.txt")
# error with 2023-11-08_12strains_40C.txt
# when extract_OD_df splits the lines strings on tab and then tries to coerce them into a matrix, R complains that "data length [27354] is not a sub-multiple or multiple of the number of columns [98]"
# I can't find the issue and Excel can't either
# so just load this one file from csv
broken_txt <- read.csv("2023-11-08_12strains_40C.csv")
# convert the wide data into long tidy data as usually done by get_OD_data
broken_txt$Time <- sapply(broken_txt$Time,
function(x) as.numeric(hms(x))/(60*60))
# now we can easily convert the whole data.frame to numeric
broken_txt[] <- lapply(broken_txt, as.numeric)
# convert Temp into the mean temperature across the run
broken_txt$Temp <- round(mean(broken_txt$Temp), digits=1)
# reshape the data to long format
broken_txt <- pivot_longer(broken_txt, cols=!c("Time", "Temp"), names_to="Well", values_to="OD")
# add block and plate columns
broken_txt$block <- "2023-11-08"
broken_txt$plate <- 2
# combine it with data from the rest of its corresponding block
# first need to change Temp factor back to numeric
EX5raw_data.df$Temp <- as.numeric(as.character(EX5raw_data.df$Temp))
EX5raw_data.df <- rbind(EX5raw_data.df, broken_txt)
# then change it back to a factor to prevent downstream issues
EX5raw_data.df$Temp <- as.factor(EX5raw_data.df$Temp)
rm(broken_txt)
EX6raw_data.df <- get_ODdata_block(blockID = "2023-11-10",
filename_1 = "2023-11-10_12strains_25C.txt")
# there's no 2023-11-10_12strains_35C.txt because this file got corrupted (see raw data)
# Stationary Phase Inoculum
ST1raw_data.df <- get_ODdata_block(blockID = "2023-11-13",
filename_1 = "2023-11-13_12strains_25C.txt",
filename_2 = "2023-11-13_12strains_35C.txt")
ST2raw_data.df <- get_ODdata_block(blockID = "2023-11-20",
filename_1 = "2023-11-20_12strains_30C.txt",
filename_2 = "2023-11-20_12strains_40C.txt")
ST3raw_data.df <- get_ODdata_block(blockID = "2023-11-15",
filename_1 = "2023-11-15_12strains_25C.txt",
filename_2 = "2023-11-15_12strains_35C.txt")
ST4raw_data.df <- get_ODdata_block(blockID = "2023-11-22",
filename_1 = "2023-11-22_12strains_30C.txt",
filename_2 = "2023-11-22_12strains_40C.txt")
ST5raw_data.df <- get_ODdata_block(blockID = "2023-11-17",
filename_1 = "2023-11-17_12strains_25C.txt",
filename_2 = "2023-11-17_12strains_35C.txt")
ST6raw_data.df <- get_ODdata_block(blockID = "2023-11-24",
filename_1 = "2023-11-24_12strains_30C.txt",
filename_2 = "2023-11-24_12strains_40C.txt")
Annotate the data using the function annotate_data
defined in “H1_extract_data_fun_v3-1.R”. The option
layout = "12columns" assumes the data is composed of 12
samples laid out over columns 1-12. Rows are assumed to be different
dilutions, with row B starting at \(10^{-1}\) and row G ending at \(10^{-6}\) (rows A & H are assumed to be
blank). You must specify the names of the samples in order from column 1
to 12 using the option samples. By default there will be a
column titled “Replicate” and, since you’re using the “12columns”
layout, this will contain all 1’s by default. This is because you only
have 1 replicate per plate for each strain x dilution combination. You
can just ignore this Replicate column (or delete it).
After annotating the data, you can combine it into a single data.frame containing all the raw data.
# define vectors for each of the 3 layouts
layout1 = c("Pseudomonas putida KT2440 - mScarlet","Pseudomonas putida uwc 2 - BFP","Pseudomonas putida F1 - sYFP","Pseudomonas veronii - mScarlet","Pseudomonas knackmussii B14 - GFP","Pseudomonas plecoglossicida - NA","Pseudomonas veronii - mCherry","Pseudomonas putida mt-2 KT2440 - NA","Pseudomonas veronii - BFP","Pseudomonas knackmussii B13 - mCherry","Pseudomonas putida KT2440 - GFP","Pseudomonas grimontii - NA")
layout2 = c("Pseudomonas veronii - mCherry","Pseudomonas veronii - BFP","Pseudomonas putida mt-2 KT2440 - NA","Pseudomonas knackmussii B13 - mCherry","Pseudomonas putida KT2440 - GFP","Pseudomonas grimontii - NA","Pseudomonas putida KT2440 - mScarlet","Pseudomonas putida F1 - sYFP","Pseudomonas putida uwc 2 - BFP","Pseudomonas veronii - mScarlet","Pseudomonas knackmussii B14 - GFP","Pseudomonas plecoglossicida - NA")
layout3 = c("Pseudomonas veronii - mScarlet","Pseudomonas knackmussii B14 - GFP","Pseudomonas plecoglossicida - NA","Pseudomonas putida KT2440 - mScarlet","Pseudomonas putida uwc 2 - BFP","Pseudomonas putida F1 - sYFP","Pseudomonas knackmussii B13 - mCherry","Pseudomonas grimontii - NA","Pseudomonas putida KT2440 - GFP","Pseudomonas veronii - mCherry","Pseudomonas veronii - BFP","Pseudomonas putida mt-2 KT2440 - NA")
# annotate the data for each raw data.frame
# Exponential Phase Inoculum
EX1raw_data.df <- annotate_data(EX1raw_data.df, layout = "12columns", samples=layout1)
EX2raw_data.df <- annotate_data(EX2raw_data.df, layout = "12columns", samples=layout1)
EX3raw_data.df <- annotate_data(EX3raw_data.df, layout = "12columns", samples=layout2)
EX4raw_data.df <- annotate_data(EX4raw_data.df, layout = "12columns", samples=layout2)
EX5raw_data.df <- annotate_data(EX5raw_data.df, layout = "12columns", samples=layout3)
EX6raw_data.df <- annotate_data(EX6raw_data.df, layout = "12columns", samples=layout3)
# Stationary Phase Inoculum
ST1raw_data.df <- annotate_data(ST1raw_data.df, layout = "12columns", samples=layout1)
ST2raw_data.df <- annotate_data(ST2raw_data.df, layout = "12columns", samples=layout1)
ST3raw_data.df <- annotate_data(ST3raw_data.df, layout = "12columns", samples=layout2)
ST4raw_data.df <- annotate_data(ST4raw_data.df, layout = "12columns", samples=layout2)
ST5raw_data.df <- annotate_data(ST5raw_data.df, layout = "12columns", samples=layout3)
ST6raw_data.df <- annotate_data(ST6raw_data.df, layout = "12columns", samples=layout3)
# combine exponential replicates into one data.frame
exponential.df <- rbind(EX1raw_data.df, EX2raw_data.df, EX3raw_data.df, EX4raw_data.df, EX5raw_data.df, EX6raw_data.df)
exponential.df$Inoculum <- "Exponential"
# combine stationary replicates into one data.frame
stationary.df <- rbind(ST1raw_data.df, ST2raw_data.df, ST3raw_data.df, ST4raw_data.df, ST5raw_data.df, ST6raw_data.df)
stationary.df$Inoculum <- "Stationary"
# combine all replicates into one giant data.frame
ALLraw_data.df <- rbind(exponential.df, stationary.df)
# remove the column titled Replicate as it is meaningless
ALLraw_data.df <- ALLraw_data.df %>% select(-Replicate)
# create a unique ID for each growth curve by pasting block, plate, and well
ALLraw_data.df$uniqID <- with(ALLraw_data.df, paste(Well, plate, block, Inoculum))
# the time column is giving very stupid and meaningless values because of division by 3
# round to nearest second
ALLraw_data.df$Time <- round(ALLraw_data.df$Time, digits = 4)
# the Gen5 program inserted ** around the values that Anjaney excluded as outliers.
# this leads to NA values that lead to downstream problems
# loop through all uniqID's to identify and remove replicates that are all NAs
for(curve in unique(ALLraw_data.df$uniqID)){
df <- ALLraw_data.df %>% filter(uniqID == curve)
if(all(is.na(df$OD))){ # identify replicates where all OD values are NA
ALLraw_data.df <-ALLraw_data.df %>% filter(uniqID != curve)
}
}
# cleanup
rm(df, curve)
# change all Temp==26 values into 25 because that's our treatment
ALLraw_data.df$Temp <- as.numeric(as.character(ALLraw_data.df$Temp))
ALLraw_data.df$Temp[which(ALLraw_data.df$Temp==26)] <- 25
# to keep your work space clean, you can now delete the many data.frames containing the individual blocks
rm(EX1raw_data.df, EX2raw_data.df, EX3raw_data.df, EX4raw_data.df, EX5raw_data.df, EX6raw_data.df, ST1raw_data.df, ST2raw_data.df, ST3raw_data.df, ST4raw_data.df, ST5raw_data.df, ST6raw_data.df, layout1, layout2, layout3, exponential.df, stationary.df)
Note that here plate 1 corresponds with H1 Synergy and plate 2 corresponds with Epoch.
This was added on 25th March 2024.
# load the data as separate data.frames
PpEXP1raw_data.df <- get_ODdata_block(blockID = "2024-03-13",
filename_1 = "Pprotegens_exponential_40C--13March24.txt",
filename_2 = "Pprotegens_exponential_35C--13March24.txt")
PpEXP2raw_data.df <- get_ODdata_block(blockID = "2024-03-11",
filename_1 = "Pprotegens_exponential_30C--11March24.txt",
filename_2 = "Pprotegens_exponential_25C--11March24.txt")
PpSTA1raw_data.df <- get_ODdata_block(blockID = "2024-03-15",
filename_1 = "Pprotegens_stationary_40C--15March24.txt",
filename_2 = "Pprotegens_stationary_30C--15March24.txt")
PpSTA2raw_data.df <- get_ODdata_block(blockID = "2024-03-18",
filename_1 = "Pprotegens_stationary_35C--18March24.txt",
filename_2 = "Pprotegens_stationary_25C--18March24.txt")
# annotate the data
layout1 <- c(rep("Pseudomonas protegens Pf5 - mTourquoise", 3), rep("Pseudomonas protegens Pf5 - mCherry", 3), rep("Pseudomonas protegens CHAO - GFP", 3), rep("Pseudomonas protegens CHAO - mCherry", 3))
layout2 <- c(rep(c("Pseudomonas protegens Pf5 - mCherry", "Pseudomonas protegens CHAO - GFP", "Pseudomonas protegens CHAO - mCherry", "Pseudomonas protegens Pf5 - mTourquoise"), times=2), "Pseudomonas protegens Pf5 - mCherry", "Pseudomonas protegens Pf5 - mTourquoise", "Pseudomonas protegens CHAO - mCherry", "Pseudomonas protegens CHAO - GFP")
layout3 <- rep(c("Pseudomonas protegens Pf5 - mTourquoise","Pseudomonas protegens Pf5 - mCherry","Pseudomonas protegens CHAO - GFP","Pseudomonas protegens CHAO - mCherry"), times=3)
# annotate the data for each raw data.frame
# Exponential Phase Inoculum
PpEXP1raw_data.df <- annotate_data(PpEXP1raw_data.df, layout = "12columns", samples=layout1)
PpEXP2raw_data.df <- annotate_data(PpEXP2raw_data.df, layout = "12columns", samples=layout2)
# Stationary Phase Inoculum
PpSTA1raw_data.df <- annotate_data(PpSTA1raw_data.df, layout = "12columns", samples=layout3)
PpSTA2raw_data.df <- annotate_data(PpSTA2raw_data.df, layout = "12columns", samples=layout2)
# combine exponential replicates into one data.frame
exponential.df <- rbind(PpEXP1raw_data.df, PpEXP2raw_data.df)
exponential.df$Inoculum <- "Exponential"
# combine stationary replicates into one data.frame
stationary.df <- rbind(PpSTA1raw_data.df, PpSTA2raw_data.df)
stationary.df$Inoculum <- "Stationary"
# combine all replicates into one giant data.frame
Ppraw_data.df <- rbind(exponential.df, stationary.df)
# remove the column titled Replicate as it is meaningless
Ppraw_data.df <- Ppraw_data.df %>% select(-Replicate)
# create a unique ID for each growth curve by pasting block, plate, and well
Ppraw_data.df$uniqID <- with(Ppraw_data.df, paste(Well, plate, block, Inoculum))
# the time column is giving very stupid and meaningless values because of division by 3
# round to nearest second
Ppraw_data.df$Time <- round(Ppraw_data.df$Time, digits = 4)
# the Gen5 program inserted ** around the values that Anjaney excluded as outliers.
# this leads to NA values that lead to downstream problems
# loop through all uniqID's to identify and remove replicates that are all NAs
for(curve in unique(Ppraw_data.df$uniqID)){
df <- Ppraw_data.df %>% filter(uniqID == curve)
if(all(is.na(df$OD))){ # identify replicates where all OD values are NA
Ppraw_data.df <- Ppraw_data.df %>% filter(uniqID != curve)
}
}
# cleanup
rm(df, curve)
# change all Temp==26 values into 25 because that's our treatment
Ppraw_data.df$Temp <- as.numeric(as.character(Ppraw_data.df$Temp))
Ppraw_data.df$Temp[which(Ppraw_data.df$Temp==26)] <- 25
# to keep your work space clean, you can now delete the many data.frames containing the individual blocks
rm(PpEXP1raw_data.df, PpEXP2raw_data.df, PpSTA1raw_data.df, PpSTA2raw_data.df, annotate_data, extract_OD_df, get_OD_data, get_ODdata_block, layout1, layout2, layout3, exponential.df, stationary.df)
Before proceeding with the analysis, make sure that the data looks as expected by plotting it.
# combine the P. protegens data with the rest of the data...
ALLraw_data.df <- rbind(ALLraw_data.df, Ppraw_data.df)
# plot all the data
ggplot(ALLraw_data.df, # specify the data.frame input
aes(y=OD, x=Time, colour=uniqID, group=uniqID )) + # specify x, y, and colour variables. Group is used here to tell ggplot how to correctly draw the lines connecting related data points.
scale_y_log10() + # use a log10 scale for the y axis
geom_line(alpha=0.1) + # draw lines connecting the points. The parameter "alpha=0.1" tells ggplot to make the lines 90% transparent.
theme(legend.position="none") + # this removes the legend entirely. We do this because the legend is giant for this plot.
labs(title="Raw Data: All Wells", x="Time (hrs)", y="A600 (raw O.D.)") # include the title of the plot and detailed labels for the axes.
# plot the data EXCEPT for the blanks
ggplot(filter(ALLraw_data.df, Sample != "BLK"), # everything is exactly the same except we are removing the blank samples using the dplyr function "filter". This keeps only the samples that are NOT called "BLK".
aes(y=OD, x=Time, colour=Sample, group=uniqID )) +
scale_y_log10() +
geom_line(alpha=0.1) +
theme(legend.title = element_text(size = 9),
legend.text = element_text(size = 7)) +
labs(title="Raw Data: All Sample Wells", x="Time (hrs)", y="A600 (raw O.D.)")
# plot the data
ggplot(filter(ALLraw_data.df, Sample == "Pseudomonas protegens Pf5 - mTourquoise", Inoculum == "Stationary", Temp == "25"),
aes(y=OD, x=Time, colour=uniqID, group=uniqID )) +
scale_y_log10() +
geom_line(alpha=0.5) +
theme(legend.position = "none") +
labs(title="Raw Data: P. protegens 25*C", x="Time (hrs)", y="A600 (raw O.D.)")
The first two plots look almost the same. The only difference is the thickness of the negative samples. Everything looks as expected since the only difference between the plots is that the first includes blanks (i.e., it contains more negative samples) and the second excludes all blanks (i.e., it contains fewer negative samples). The third plot shows lack of growth at higher temperature.
Do the baseline subtraction to get the OD values:
# baseline subtract using the median OD value of the blanks for each time point, for each plate
# create a data.frame containing only the blank samples for all plates
data.blanks <- ALLraw_data.df %>% filter(Sample=="BLK")
# calculate the median OD value for the blanks at each time point for each plate.
medianOD <- data.blanks %>% group_by(Time, block, plate) %>% # group the blanks together for each time point and plate
summarise(medianBlankOD = median(OD, na.rm=TRUE)) # get median OD value
# put the data.blanks information back into the full dataset
ALL_data.df <- inner_join(ALLraw_data.df %>% filter(Sample!="BLK"), # remove blank samples
medianOD)
# Finally, do the baseline subtraction by subtracting the medianBlankOD from the OD values
ALL_data.df$baselinedOD <- ALL_data.df$OD - ALL_data.df$medianBlankOD
# plot the data
ggplot(filter(ALL_data.df, Sample == "Pseudomonas protegens Pf5 - mTourquoise", Inoculum == "Stationary", Temp == "25"),
aes(y= baselinedOD, x=Time, colour=Dilution, group=uniqID )) +
scale_y_log10() +
geom_line() +
geom_hline(yintercept = 0.05) +
theme(legend.position = "none") +
labs(title="P. protegens, Stationary, 25C, TTDCutoff = 0.05", x="Time (hrs)", y="A600 (corrected O.D.)")
# clean-up
rm(data.blanks, medianOD)
Let’s see how many data points we have for all samples and treatments:
# separate the species, strain, and fluorophore information from the unique sample names
ALL_data.df <- ALL_data.df %>% separate(col=Sample, sep=" - ", into=c("Genotype", "Fluor"), remove=FALSE)
# parse the Genotype column into a species column
ALL_data.df$Species <- sub("Pseudomonas (\\w+)", "\\1",
str_extract(ALL_data.df$Genotype, "Pseudomonas (\\w+)"))
ALL_data.df$Species <- paste("P.", ALL_data.df$Species)
# For some samples, we have additional strain information. Parse this from the Genotype column into a strain column
ALL_data.df$Strain <- NA
ALL_data.df$Strain[as.logical(str_count(ALL_data.df$Genotype, "\\w+\\s\\w+\\s.*"))] <- sub("(\\S+\\s+){2}(.*)", "\\2", ALL_data.df$Genotype[as.logical(str_count(ALL_data.df$Genotype, "\\w+\\s\\w+\\s.*"))])
# Replace the information in the Sample column with the unique sample ID from our strain collection
ALL_data.df$Sample <- as.character(ALL_data.df$Sample)
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas putida F1 - sYFP"] <- "BSC001"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas putida KT2440 - mScarlet"] <- "BSC002"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas putida uwc 2 - BFP"] <- "BSC003"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas veronii - BFP"] <- "BSC004"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas veronii - mScarlet"] <- "BSC005"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas veronii - mCherry"] <- "BSC006"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas knackmussii B13 - mCherry"] <- "BSC007"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas knackmussii B14 - GFP"] <- "BSC008"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas plecoglossicida - NA"] <- "BSC009"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas putida mt-2 KT2440 - NA"] <- "BSC010"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas putida KT2440 - GFP"] <- "BSC015"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas grimontii - NA"] <- "BSC019"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas protegens Pf5 - mTourquoise"] <- "CK101"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas protegens Pf5 - mCherry"] <- "CK102"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas protegens CHAO - GFP"] <- "CK103"
ALL_data.df$Sample[ALL_data.df$Sample == "Pseudomonas protegens CHAO - mCherry"] <- "CK104"
# remove the genotype column
ALL_data.df <- ALL_data.df %>% select(-Genotype)
# check that all the data we loaded is actually there
check_data <- ALL_data.df %>% filter(Time < 0.2) %>%
group_by(Sample, Temp, Dilution, Inoculum) %>%
summarise(Count=n()) %>% as.data.frame()
summary(check_data)
# 35*C in block 2023-11-10 was corrupted so that's why we're missing those data points
check_data %>% filter(Count < 3) %>% head()
# display the data that have fewer than 3 replicates
check_data %>% filter(Temp != 35, Count < 3)
# cleanup
rm(check_data, ALLraw_data.df, Ppraw_data.df)
# save the good data to output for easy loading in downstream analyses
save(ALL_data.df, file="Anjaney+Pprotegens_all_data.RData")
Great! It seems that we have successfully excluded the contaminated data :)
This section of code was added on 7 March 2024, after most of the stuff below.
I define carrying capacity as the median OD achieved after 24h of growth but before 48h. There is significant evaporation from the high temperature wells so that’s why I am cutting off the later time points. I will only consider the 2 highest starting concentrations: 0.1 and 0.01 because otherwise you need to wait longer to be certain that all strains have reached their carrying capacity.
I will load the OD-to-CFU calibration data and use the exponential phase estimates at 25*C to get the carrying capacity for the following 3 species: P. putida, P. veronii, and P. knackmussii.
load("Anjaney_all_data.RData")
# throw out all baselined OD values whose OD is past the Beer-Lambert law
kOD_data.df <- rbind(ALL_data.df %>% filter(plate==1, baselinedOD < 1.4), # too high OD measured on the Synergy
ALL_data.df %>% filter(plate==2, baselinedOD < 1.1)) # too high OD measured on the epoch
ggplot(kOD_data.df %>% filter(Species %in% c("P. putida", "P. veronii", "P. knackmussii"),
Dilution %in% c("0.1", "0.01"),
Time>24,
Time<40),
aes(x=Time, y=baselinedOD, group=uniqID, colour=Species)) +
geom_line(alpha=0.2) +
labs(title="Data used for estimating K: get median")
# get the median OD value between 24-40 hours
kOD_data.df <- kOD_data.df %>% filter(Species %in% c("P. putida", "P. veronii", "P. knackmussii"),
Dilution %in% c("0.1", "0.01"),
Time>24,
Time<40) %>%
group_by(uniqID, Temp, plate, Sample, Inoculum, Species, Strain) %>%
summarise(medianOD = log10(median(baselinedOD)))
# convert the OD data into CFU estimates
load("OD_to_CFU_conversion.RData")
# define functions for each species
OD_to_CFU.putida <- function(log10OD, detector, temp){
if(detector=="synergy" & temp==25){
return(10^(log10OD*all_calibrations$estimate[26] + all_calibrations$estimate[25]))}
if(detector=="epoch" & temp==25){
return(10^(log10OD*all_calibrations$estimate[32] + all_calibrations$estimate[31]))}
if(detector=="synergy" & temp==40){
return(10^(log10OD*all_calibrations$estimate[30] + all_calibrations$estimate[29]))}
if(detector=="epoch" & temp==40){
return(10^(log10OD*all_calibrations$estimate[36] + all_calibrations$estimate[35]))}
}
OD_to_CFU.knack <- function(log10OD, detector, temp){
if(detector=="synergy" & temp==25){
return(10^(log10OD*all_calibrations$estimate[64] + all_calibrations$estimate[63]))}
if(detector=="epoch" & temp==25){
return(10^(log10OD*all_calibrations$estimate[72] + all_calibrations$estimate[71]))}
if(detector=="synergy" & temp==40){
return(10^(log10OD*all_calibrations$estimate[66] + all_calibrations$estimate[65]))}
if(detector=="epoch" & temp==40){
return(10^(log10OD*all_calibrations$estimate[74] + all_calibrations$estimate[73]))}
}
OD_to_CFU.veronii <- function(log10OD, detector, temp){
if(detector=="synergy" & temp==25){
return(10^(log10OD*all_calibrations$estimate[70] + all_calibrations$estimate[69]))}
if(detector=="epoch" & temp==25){
return(10^(log10OD*all_calibrations$estimate[70] + all_calibrations$estimate[69]))}
if(detector=="synergy" & temp==40){
return(10^(log10OD*all_calibrations$estimate[70] + all_calibrations$estimate[69]))}
if(detector=="epoch" & temp==40){
return(10^(log10OD*all_calibrations$estimate[70] + all_calibrations$estimate[69]))}
}
# do it one at a time for each species
k_data.df <- rbind(kOD_data.df %>% filter(Species == "P. putida", plate==1, Temp<35) %>% mutate(k = OD_to_CFU.putida(medianOD, detector="synergy", temp=25)),
kOD_data.df %>% filter(Species == "P. putida", plate==1, Temp>30) %>% mutate(k = OD_to_CFU.putida(medianOD, detector="synergy", temp=40)),
kOD_data.df %>% filter(Species == "P. putida", plate==2, Temp<35) %>% mutate(k = OD_to_CFU.putida(medianOD, detector="epoch", temp=25)),
kOD_data.df %>% filter(Species == "P. putida", plate==2, Temp>30) %>% mutate(k = OD_to_CFU.putida(medianOD, detector="epoch", temp=40)))
k_data.df <- rbind(k_data.df,
kOD_data.df %>% filter(Species == "P. knackmussii", plate==1, Temp<35) %>% mutate(k = OD_to_CFU.knack(medianOD, detector="synergy", temp=25)),
kOD_data.df %>% filter(Species == "P. knackmussii", plate==1, Temp>30) %>% mutate(k = OD_to_CFU.knack(medianOD, detector="synergy", temp=40)),
kOD_data.df %>% filter(Species == "P. knackmussii", plate==2, Temp<35) %>% mutate(k = OD_to_CFU.knack(medianOD, detector="epoch", temp=25)),
kOD_data.df %>% filter(Species == "P. knackmussii", plate==2, Temp>30) %>% mutate(k = OD_to_CFU.knack(medianOD, detector="epoch", temp=40)))
k_data.df <- rbind(k_data.df,
kOD_data.df %>% filter(Species == "P. veronii", plate==1, Temp<35) %>% mutate(k = OD_to_CFU.veronii(medianOD, detector="synergy", temp=25)),
kOD_data.df %>% filter(Species == "P. veronii", plate==1, Temp>30) %>% mutate(k = OD_to_CFU.veronii(medianOD, detector="synergy", temp=40)),
kOD_data.df %>% filter(Species == "P. veronii", plate==2, Temp<35) %>% mutate(k = OD_to_CFU.veronii(medianOD, detector="epoch", temp=25)),
kOD_data.df %>% filter(Species == "P. veronii", plate==2, Temp>30) %>% mutate(k = OD_to_CFU.veronii(medianOD, detector="epoch", temp=40)))
ggplot(k_data.df %>% group_by(Sample, Temp, Species) %>%
summarise(meank = mean(k),
sdk = sd(k)),
aes(x=Temp, y=meank, colour=Species)) +
geom_point(alpha=0.5) +
geom_errorbar(aes(ymin=meank-sdk, ymax=meank+sdk), width=0.05) +
scale_y_log10() +
geom_line(aes(x=Temp), stat="smooth", method="loess",
#formula=???,
alpha=0.5) +
labs(y="Carrying Capacity (+/- SD)", x="Temperature")
See from Anjaney’s presentation that an OD value of 0.05 is a reasonable cut-off for the time-to-detection (TTD) such that all curves are still in exponential growth at this value (i.e., growth is linear when plotted on a log scale).
We will get a more fine-grained approximation for the TTD by using kernel smoothing and find the exact time when the threshold is passed (i.e., as compared to Anjaney’s presentation, where he got a coarse-grained estimate of the TTD).
load("Anjaney+Pprotegens_all_data.RData")
# set the cut-off to 0.05 because this is the value that Anjaney found where all growth curves are still in the "log-linear" phase.
TTDcutoff.low <- 0.05
tempdf <- ALL_data.df %>% filter(uniqID == "B1 1 2023-10-30 Exponential")
# perform linear interpolation using OD as the independent variable and Time as the dependent
tempdf.Time <- approx(y=tempdf$Time, x=tempdf$baselinedOD,
xout=TTDcutoff.low, ties="mean")$y #when there are non-unique values for baselinedOD, it takes the mean across these (that's why I'm NOT using the log of baselinedOD because then ties would be resolved using the geometric mean and I don't want that)
# plot to check that this is working properly
ggplot(tempdf,
aes(y= baselinedOD, x=Time)) +
scale_y_log10() +
geom_line() +
xlim(0,5) +
geom_hline(yintercept = TTDcutoff.low, col="blue") +
geom_vline(xintercept = tempdf.Time, col="red") +
theme(legend.position = "none") +
labs(title="Sanity check of TTD loess", x="Time (hrs)", y="A600 (corrected O.D.)")
## Warning: Removed 254 rows containing missing values or values outside the scale range
## (`geom_line()`).
rm(tempdf, tempdf.Time)
# initialize an empty data.frame for storage
TTD.df <- ALL_data.df %>% select(-Time, -Well, -OD, -medianBlankOD, -baselinedOD) %>% distinct()
TTD.df$TTD <- NA
# loop through all uniqID's
for(curve in unique(ALL_data.df$uniqID)) {
# calculate the detection time using interpolation
detect_t <- with(ALL_data.df %>% filter(uniqID == curve),
approx(y=Time, x=baselinedOD, xout=TTDcutoff.low, ties="mean")$y)
# save the time to the storage data.frame
TTD.df$TTD[TTD.df$uniqID == curve] <- detect_t
}
rm(curve, detect_t)
# check that NA values for TTD correspond with curves that failed to grow
# keep OD values for the unique ID's that have TTD equal to NA
tempdf <- ALL_data.df %>% filter(uniqID %in% TTD.df$uniqID[is.na(TTD.df$TTD)])
ggplot(tempdf,
aes(y = baselinedOD, x = Time, colour = uniqID, group = uniqID)) +
scale_y_log10() +
geom_line() +
#xlim(0,5) +
geom_hline(yintercept = TTDcutoff.low, col="blue") +
theme(legend.position = "none") +
labs(title="Checking growth curves with TTD 0.05=NA", x="Time (hrs)", y="A600 (corrected O.D.)")
## Warning in transformation$transform(x): NaNs produced
## Warning in scale_y_log10(): log-10 transformation introduced infinite values.
## Warning: Removed 51457 rows containing missing values or values outside the scale range
## (`geom_line()`).
ggplot(tempdf[which(tempdf$baselinedOD > TTDcutoff.low),],
aes(y = baselinedOD, x = Time, colour = uniqID, group = uniqID)) +
scale_y_log10() +
geom_line() +
geom_hline(yintercept = TTDcutoff.low, col="blue") +
geom_hline(yintercept = 0.13, col="red") +
labs(title="Checking growth curves with TTD 0.05=NA", x="Time (hrs)", y="A600 (corrected O.D.)")
# let's repeat the TTD value calculation for slightly higher TTD cutoff where all growth curves can be included
# rename the first TTD value calculation in the storage data.frame
TTD.df <- TTD.df %>% rename(TTD_0.05 = TTD)
# define the higher TTD cutoff value and initialize storage vector
TTDcutoff.hi <- 0.13
TTD.df$TTD_0.13 <- NA
# loop through all uniqID's
for(curve in unique(ALL_data.df$uniqID)) {
# calculate the detection time using interpolation
detect_t <- with(ALL_data.df %>% filter(uniqID == curve),
approx(y=Time, x=baselinedOD, xout=TTDcutoff.hi, ties="mean")$y)
# save the time to the storage data.frame
TTD.df$TTD_0.13[TTD.df$uniqID == curve] <- detect_t
}
# check again that the NA TTD values represent growth curves that failed to grow
tempdf <- ALL_data.df %>% filter(uniqID %in% TTD.df$uniqID[is.na(TTD.df$TTD_0.13)])
ggplot(tempdf,
aes(y = baselinedOD, x = Time, colour = uniqID, group = uniqID)) +
scale_y_log10() +
geom_line() +
#xlim(0,5) +
geom_hline(yintercept = TTDcutoff.hi, col="red") +
theme(legend.position = "none") +
labs(title="Checking growth curves with TTD 0.13=NA", x="Time (hrs)", y="A600 (corrected O.D.)")
## Warning in transformation$transform(x): NaNs produced
## Warning in scale_y_log10(): log-10 transformation introduced infinite values.
## Warning: Removed 52225 rows containing missing values or values outside the scale range
## (`geom_line()`).
#clean up
rm(curve, detect_t, tempdf)
It seems that the lower TTD value (0.05) is good for most of the growth curves but there are a couple of growth curves that start with too high OD, even after baselining. That’s why I tried setting a higher TTD value (0.13). The problem with this higher value is that we lose some of the growth curves that only cross this threshold later in growth. shrug This is not a perfect method… But hopefully we can make some reasonable interpretations.
Calculate the net rate of growth by taking the inverse of the time to detection:
# calculate the net rate of growth
TTD.df$rate_0.05 <- 1/TTD.df$TTD_0.05
TTD.df$rate_0.13 <- 1/TTD.df$TTD_0.13
# check the correlation in net growth rate estimated by the 2 methods
ggplot(TTD.df, aes(x=rate_0.05, y=rate_0.13)) +
geom_abline(slope=1, intercept=0, colour="grey") +
geom_point(alpha=0.1) +
geom_smooth(se=FALSE, method="lm") +
labs(x="TTD threshold = 0.05", y="TTD threshold = 0.13")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 482 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 482 rows containing missing values or values outside the scale range
## (`geom_point()`).
summary(lm(TTD.df$rate_0.13 ~ TTD.df$rate_0.05))
##
## Call:
## lm(formula = TTD.df$rate_0.13 ~ TTD.df$rate_0.05)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.38736 -0.00472 -0.00035 0.00474 0.04088
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0159614 0.0006765 23.6 <2e-16 ***
## TTD.df$rate_0.05 0.7378960 0.0052760 139.9 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01494 on 1736 degrees of freedom
## (482 observations deleted due to missingness)
## Multiple R-squared: 0.9185, Adjusted R-squared: 0.9184
## F-statistic: 1.956e+04 on 1 and 1736 DF, p-value: < 2.2e-16
As expected, the larger TTD cutoff leads to a slower estimate of the net growth rate, especially for higher growth rate estimates. This is expected. In general, prefer the smaller TTD cutoff.
Import the CFU data to inform us about the starting concentration of cells in each replicate. I will use this to exclude dilutions that started with less than 50 cells, similar to Mytilinaios et al. 2015.
I’m not sure how to correctly propagate the sd’s across the dilution series (e.g., assuming a random pipetting error of 5% in addition to the error on the inoculum size at highest concentration). Moreover, even if I had proper estimates for the sd on the inoculum size, these would not be used for the linear regression that I do below to get the intrinsic growth rate. So I will just ignore the sd on the inoculum size.
CFUraw_inocula <- read_excel("CFU_data_2023-12-13.xlsx", sheet="inocula")
CFUraw_survival <- read_excel("CFU_data_2023-12-13.xlsx", sheet="Temp_survival")
# remove data point where the plate was noted to have dried out
CFUraw_inocula <- CFUraw_inocula[!with(CFUraw_inocula, grepl("Plate dried out after", Notes)),]
# remove survival data where fewer than 15 cells were counted for the 28*C control condition
CFUraw_survival <- CFUraw_survival %>% filter(CFU_at_28 > 14)
# calculate the concentration of the cryostocked inoculum
CFUraw_inocula$Concentration <- with(CFUraw_inocula,
CFU/Vol_Plated_mL*1/Dilution_Counted)
# get mean and variance
inocALL_data <- CFUraw_inocula %>% group_by(Sample, Temp, Inoculum) %>%
summarise(mean_inoc_density = mean(Concentration),
sd_inoc_density = sd(Concentration))
## `summarise()` has grouped output by 'Sample', 'Temp'. You can override using
## the `.groups` argument.
# combine the inoculum values for 28*C with the TTD data
# first re-arrange the CFU data.frame to match the columns in TTD.df
inoc_data <- inocALL_data %>% filter(Temp==28)
inoc_data$Temp <- NULL
# then calculate the initial population sizes for the different dilutions
inoc_data <- do.call("rbind", replicate(6, inoc_data, simplify = FALSE))
inoc_data$Dilution <- rep(10^(-1*(1:6)), each=24+4*2)
# calculate the mean N0
inoc_data$mean_N0 <- with(inoc_data, mean_inoc_density*Dilution)
###The code block below is trying to estimate sd of the inoculum size. Ignore.
###
# I would like to propagate this variance by assuming a 5% variance for each dilution (which seems reasonable because we designed the protocol to use the good pipettors at the top of their range)
# I think I should use the following formula to do this: the variance of two independent, normal variables when they are multiplied together is Var(XY)=(μX⋅μY)^2+μX^2⋅σY^2+μY^2⋅σX^2+σX^2⋅σY^2
# therefore, if we substitute μY for the mean dilution (D) and σY^2 for the variance of the dilution (D*0.05) and we keep μX as the mean of the inoculum density and σX as the standard deviation of the inoculum density then we get: the standard deviation of D dilution = sqrt((μ*D)^2 + (μ^2*(D*0.05)) + (D^2*σ^2) + (σ^2*(D*0.05)))
#inoc_data$sd_N0 <- with(inoc_data,
# sqrt((mean_inoc_density*Dilution)^2 + (mean_inoc_density^2*(Dilution*0.05)) + (Dilution^2*sd_inoc_density^2) + (sd_inoc_density^2*(Dilution*0.05))))
# this yields very large sd values, I'm not happy with that.
# here's the wrong way we could do the sd values (I'm not happy with this either):
#inoc_data$sd_optimistic_N0 <- with(inoc_data,
# sqrt(sd_inoc_density^2+Dilution*0.05))
###
###End of sd of inoculum size calculation attempt.
# remove the mean and sd inoc_density columns because we won't need them here
inoc_data$mean_inoc_density <- inoc_data$sd_inoc_density <- NULL
# combine the data sets
inoc_data$Dilution <- as.factor(inoc_data$Dilution)
TTD.df <- inner_join(inoc_data, TTD.df, by=c("Sample", "Inoculum", "Dilution"))
rm(inoc_data)
# exclude growth curves that started with less than 50 cells on average
TTD.df <- TTD.df %>% filter(mean_N0 > 50)
For some treatments/samples, I can use the CFU data to calculate the death rate. In other words, the survival at the two highest temperatures (\(35^{\circ}C\) and \(40^{\circ}C\)).
# calculate the survival under the extreme temperatures as a fraction of the density at 29
CFUraw_survival <- CFUraw_survival %>% mutate(survival = CFU_at_stress/CFU_at_28) %>%
rename(Temp = Stress_Temp) # rename this column because leading to confusion below
# get mean and bootstrapped confidence intervals
CFU_survival.df <- CFUraw_survival %>% group_by(Sample, Temp, Inoculum) %>%
summarise(ci = list(mean_cl_boot(survival) %>%
rename(mean_surviv=y, lwr_ci=ymin, upr_ci=ymax))) %>% unnest(cols = c(ci))
## `summarise()` has grouped output by 'Sample', 'Temp'. You can override using
## the `.groups` argument.
# combine the data sets
TTD.df <- right_join(CFU_survival.df,
TTD.df, by=c("Sample", "Temp", "Inoculum"))
# assume survival at 25 and 30*C is 1.0
TTD.df$mean_surviv[TTD.df$Temp %in% c(25,30)] <- 1.0
# calculate the mean surviving N0
TTD.df$surviving_N0 <- with(TTD.df,
mean_surviv * mean_N0)
TTD.df$surviving_N0_lwr <- with(TTD.df,
lwr_ci * mean_N0)
TTD.df$surviving_N0_upr <- with(TTD.df,
upr_ci * mean_N0)
Let’s check if there’s a significant effect of inoculum phase on the survival based on CFU. To do this we will use a two-way ANOVA.
# add the species column to the dataset
CFUraw_survival <- left_join(CFUraw_survival,
TTD.df %>% ungroup() %>% select(Sample, Species, Strain) %>% distinct())
## Joining with `by = join_by(Sample)`
# convert the columns of the independent variables to factors
CFUraw_survival$Temp <- as.factor(CFUraw_survival$Temp)
CFUraw_survival$Species <- as.factor(CFUraw_survival$Species)
CFUraw_survival$Inoculum <- as.factor(CFUraw_survival$Inoculum)
# re-order the Sample factors for more distinct colour plotting
CFUraw_survival$Sample <- factor(CFUraw_survival$Sample, levels=c("BSC001", "BSC004", "BSC007", "CK101", "BSC002", "BSC005", "BSC008", "CK102", "BSC003", "BSC006", "BSC010","CK103", "BSC009", "BSC019", "BSC015", "CK104"))
# do the anova
# no interaction
survival.anova <- aov(survival ~ Inoculum + Species + Temp, data = CFUraw_survival)
# interaction
survival.anova.ALLinteractions <- aov(survival ~ Inoculum * Species * Temp, data = CFUraw_survival)
# use AIC to select the preferred model
model.set <- list(survival.anova, survival.anova.ALLinteractions)
model.names <- c("two.way", "interaction")
aictab(model.set, modnames = model.names)
# display the results
summary(survival.anova.ALLinteractions)
## Df Sum Sq Mean Sq F value Pr(>F)
## Inoculum 1 0.291 0.291 6.420 0.01222 *
## Species 5 18.113 3.623 79.869 < 2e-16 ***
## Temp 1 9.650 9.650 212.749 < 2e-16 ***
## Inoculum:Species 5 3.187 0.637 14.051 1.96e-11 ***
## Inoculum:Temp 1 0.015 0.015 0.329 0.56678
## Species:Temp 5 5.805 1.161 25.595 < 2e-16 ***
## Inoculum:Species:Temp 5 0.775 0.155 3.419 0.00576 **
## Residuals 164 7.439 0.045
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
TukeyHSD(survival.anova.ALLinteractions)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = survival ~ Inoculum * Species * Temp, data = CFUraw_survival)
##
## $Inoculum
## diff lwr upr p adj
## Stationary-Exponential 0.07870944 0.01736996 0.1400489 0.0122249
##
## $Species
## diff lwr upr
## P. knackmussii-P. grimontii 0.53041593 0.31328037 0.747551497
## P. plecoglossicida-P. grimontii 0.21675433 -0.04620990 0.479718556
## P. protegens-P. grimontii 0.13078505 -0.06743170 0.329001790
## P. putida-P. grimontii 0.61360552 0.41883628 0.808374750
## P. veronii-P. grimontii -0.19567842 -0.40039579 0.009038954
## P. plecoglossicida-P. knackmussii -0.31366160 -0.54482006 -0.082503143
## P. protegens-P. knackmussii -0.39963089 -0.55316892 -0.246092856
## P. putida-P. knackmussii 0.08318958 -0.06587115 0.232250321
## P. veronii-P. knackmussii -0.72609435 -0.88793765 -0.564251057
## P. protegens-P. plecoglossicida -0.08596928 -0.29945525 0.127516685
## P. putida-P. plecoglossicida 0.39685119 0.18656226 0.607140120
## P. veronii-P. plecoglossicida -0.41243275 -0.63196767 -0.192897823
## P. putida-P. protegens 0.48282047 0.36298255 0.602658393
## P. veronii-P. protegens -0.32646347 -0.46187128 -0.191055650
## P. veronii-P. putida -0.80928394 -0.93959300 -0.678974869
## p adj
## P. knackmussii-P. grimontii 0.0000000
## P. plecoglossicida-P. grimontii 0.1704970
## P. protegens-P. grimontii 0.4042210
## P. putida-P. grimontii 0.0000000
## P. veronii-P. grimontii 0.0699516
## P. plecoglossicida-P. knackmussii 0.0018287
## P. protegens-P. knackmussii 0.0000000
## P. putida-P. knackmussii 0.5935688
## P. veronii-P. knackmussii 0.0000000
## P. protegens-P. plecoglossicida 0.8544653
## P. putida-P. plecoglossicida 0.0000028
## P. veronii-P. plecoglossicida 0.0000031
## P. putida-P. protegens 0.0000000
## P. veronii-P. protegens 0.0000000
## P. veronii-P. putida 0.0000000
##
## $Temp
## diff lwr upr p adj
## 40-35 -0.4526476 -0.5139905 -0.3913046 0
##
## $`Inoculum:Species`
## diff
## Stationary:P. grimontii-Exponential:P. grimontii 0.2492025246
## Exponential:P. knackmussii-Exponential:P. grimontii 0.3005235154
## Stationary:P. knackmussii-Exponential:P. grimontii 1.0095108734
## Exponential:P. plecoglossicida-Exponential:P. grimontii 0.4650839361
## Stationary:P. plecoglossicida-Exponential:P. grimontii 0.2719882684
## Exponential:P. protegens-Exponential:P. grimontii 0.2394949659
## Stationary:P. protegens-Exponential:P. grimontii 0.2712776503
## Exponential:P. putida-Exponential:P. grimontii 0.7898550252
## Stationary:P. putida-Exponential:P. grimontii 0.6800583197
## Exponential:P. veronii-Exponential:P. grimontii -0.1131678197
## Stationary:P. veronii-Exponential:P. grimontii -0.0289864946
## Exponential:P. knackmussii-Stationary:P. grimontii 0.0513209908
## Stationary:P. knackmussii-Stationary:P. grimontii 0.7603083488
## Exponential:P. plecoglossicida-Stationary:P. grimontii 0.2158814115
## Stationary:P. plecoglossicida-Stationary:P. grimontii 0.0227857438
## Exponential:P. protegens-Stationary:P. grimontii -0.0097075587
## Stationary:P. protegens-Stationary:P. grimontii 0.0220751257
## Exponential:P. putida-Stationary:P. grimontii 0.5406525006
## Stationary:P. putida-Stationary:P. grimontii 0.4308557951
## Exponential:P. veronii-Stationary:P. grimontii -0.3623703443
## Stationary:P. veronii-Stationary:P. grimontii -0.2781890192
## Stationary:P. knackmussii-Exponential:P. knackmussii 0.7089873580
## Exponential:P. plecoglossicida-Exponential:P. knackmussii 0.1645604207
## Stationary:P. plecoglossicida-Exponential:P. knackmussii -0.0285352470
## Exponential:P. protegens-Exponential:P. knackmussii -0.0610285494
## Stationary:P. protegens-Exponential:P. knackmussii -0.0292458651
## Exponential:P. putida-Exponential:P. knackmussii 0.4893315098
## Stationary:P. putida-Exponential:P. knackmussii 0.3795348044
## Exponential:P. veronii-Exponential:P. knackmussii -0.4136913350
## Stationary:P. veronii-Exponential:P. knackmussii -0.3295100099
## Exponential:P. plecoglossicida-Stationary:P. knackmussii -0.5444269373
## Stationary:P. plecoglossicida-Stationary:P. knackmussii -0.7375226050
## Exponential:P. protegens-Stationary:P. knackmussii -0.7700159075
## Stationary:P. protegens-Stationary:P. knackmussii -0.7382332231
## Exponential:P. putida-Stationary:P. knackmussii -0.2196558482
## Stationary:P. putida-Stationary:P. knackmussii -0.3294525537
## Exponential:P. veronii-Stationary:P. knackmussii -1.1226786931
## Stationary:P. veronii-Stationary:P. knackmussii -1.0384973680
## Stationary:P. plecoglossicida-Exponential:P. plecoglossicida -0.1930956677
## Exponential:P. protegens-Exponential:P. plecoglossicida -0.2255889702
## Stationary:P. protegens-Exponential:P. plecoglossicida -0.1938062859
## Exponential:P. putida-Exponential:P. plecoglossicida 0.3247710891
## Stationary:P. putida-Exponential:P. plecoglossicida 0.2149743836
## Exponential:P. veronii-Exponential:P. plecoglossicida -0.5782517558
## Stationary:P. veronii-Exponential:P. plecoglossicida -0.4940704307
## Exponential:P. protegens-Stationary:P. plecoglossicida -0.0324933024
## Stationary:P. protegens-Stationary:P. plecoglossicida -0.0007106181
## Exponential:P. putida-Stationary:P. plecoglossicida 0.5178667568
## Stationary:P. putida-Stationary:P. plecoglossicida 0.4080700514
## Exponential:P. veronii-Stationary:P. plecoglossicida -0.3851560880
## Stationary:P. veronii-Stationary:P. plecoglossicida -0.3009747629
## Stationary:P. protegens-Exponential:P. protegens 0.0317826843
## Exponential:P. putida-Exponential:P. protegens 0.5503600593
## Stationary:P. putida-Exponential:P. protegens 0.4405633538
## Exponential:P. veronii-Exponential:P. protegens -0.3526627856
## Stationary:P. veronii-Exponential:P. protegens -0.2684814605
## Exponential:P. putida-Stationary:P. protegens 0.5185773749
## Stationary:P. putida-Stationary:P. protegens 0.4087806695
## Exponential:P. veronii-Stationary:P. protegens -0.3844454699
## Stationary:P. veronii-Stationary:P. protegens -0.3002641448
## Stationary:P. putida-Exponential:P. putida -0.1097967055
## Exponential:P. veronii-Exponential:P. putida -0.9030228449
## Stationary:P. veronii-Exponential:P. putida -0.8188415198
## Exponential:P. veronii-Stationary:P. putida -0.7932261394
## Stationary:P. veronii-Stationary:P. putida -0.7090448143
## Stationary:P. veronii-Exponential:P. veronii 0.0841813251
## lwr
## Stationary:P. grimontii-Exponential:P. grimontii -0.158519797
## Exponential:P. knackmussii-Exponential:P. grimontii -0.052574373
## Stationary:P. knackmussii-Exponential:P. grimontii 0.656412985
## Exponential:P. plecoglossicida-Exponential:P. grimontii 0.009236522
## Stationary:P. plecoglossicida-Exponential:P. grimontii -0.135734053
## Exponential:P. protegens-Exponential:P. grimontii -0.082837832
## Stationary:P. protegens-Exponential:P. grimontii -0.051055147
## Exponential:P. putida-Exponential:P. grimontii 0.474034673
## Stationary:P. putida-Exponential:P. grimontii 0.362363646
## Exponential:P. veronii-Exponential:P. grimontii -0.446071701
## Stationary:P. veronii-Exponential:P. grimontii -0.361890376
## Exponential:P. knackmussii-Stationary:P. grimontii -0.301776898
## Stationary:P. knackmussii-Stationary:P. grimontii 0.407210460
## Exponential:P. plecoglossicida-Stationary:P. grimontii -0.239966002
## Stationary:P. plecoglossicida-Stationary:P. grimontii -0.384936578
## Exponential:P. protegens-Stationary:P. grimontii -0.332040356
## Stationary:P. protegens-Stationary:P. grimontii -0.300257672
## Exponential:P. putida-Stationary:P. grimontii 0.224832148
## Stationary:P. putida-Stationary:P. grimontii 0.113161121
## Exponential:P. veronii-Stationary:P. grimontii -0.695274226
## Stationary:P. veronii-Stationary:P. grimontii -0.611092901
## Stationary:P. knackmussii-Exponential:P. knackmussii 0.420684139
## Exponential:P. plecoglossicida-Exponential:P. knackmussii -0.243161901
## Stationary:P. plecoglossicida-Exponential:P. knackmussii -0.381633135
## Exponential:P. protegens-Exponential:P. knackmussii -0.310706461
## Stationary:P. protegens-Exponential:P. knackmussii -0.278923776
## Exponential:P. putida-Exponential:P. knackmussii 0.248119731
## Stationary:P. putida-Exponential:P. knackmussii 0.135874113
## Exponential:P. veronii-Exponential:P. knackmussii -0.676874962
## Stationary:P. veronii-Exponential:P. knackmussii -0.592693637
## Exponential:P. plecoglossicida-Stationary:P. knackmussii -0.952149259
## Stationary:P. plecoglossicida-Stationary:P. knackmussii -1.090620493
## Exponential:P. protegens-Stationary:P. knackmussii -1.019693819
## Stationary:P. protegens-Stationary:P. knackmussii -0.987911134
## Exponential:P. putida-Stationary:P. knackmussii -0.460867627
## Stationary:P. putida-Stationary:P. knackmussii -0.573113245
## Exponential:P. veronii-Stationary:P. knackmussii -1.385862320
## Stationary:P. veronii-Stationary:P. knackmussii -1.301680995
## Stationary:P. plecoglossicida-Exponential:P. plecoglossicida -0.648943081
## Exponential:P. protegens-Exponential:P. plecoglossicida -0.606978279
## Stationary:P. protegens-Exponential:P. plecoglossicida -0.575195595
## Exponential:P. putida-Exponential:P. plecoglossicida -0.051130318
## Stationary:P. putida-Exponential:P. plecoglossicida -0.162503137
## Exponential:P. veronii-Exponential:P. plecoglossicida -0.968616159
## Stationary:P. veronii-Exponential:P. plecoglossicida -0.884434834
## Exponential:P. protegens-Stationary:P. plecoglossicida -0.354826100
## Stationary:P. protegens-Stationary:P. plecoglossicida -0.323043416
## Exponential:P. putida-Stationary:P. plecoglossicida 0.202046404
## Stationary:P. putida-Stationary:P. plecoglossicida 0.090375378
## Exponential:P. veronii-Stationary:P. plecoglossicida -0.718059970
## Stationary:P. veronii-Stationary:P. plecoglossicida -0.633878645
## Stationary:P. protegens-Exponential:P. protegens -0.172078477
## Exponential:P. putida-Exponential:P. protegens 0.356960381
## Stationary:P. putida-Exponential:P. protegens 0.244117824
## Exponential:P. veronii-Exponential:P. protegens -0.572858006
## Stationary:P. veronii-Exponential:P. protegens -0.488676681
## Exponential:P. putida-Stationary:P. protegens 0.325177696
## Stationary:P. putida-Stationary:P. protegens 0.212335139
## Exponential:P. veronii-Stationary:P. protegens -0.604640690
## Stationary:P. veronii-Stationary:P. protegens -0.520459365
## Stationary:P. putida-Exponential:P. putida -0.295363160
## Exponential:P. veronii-Exponential:P. putida -1.113569746
## Stationary:P. veronii-Exponential:P. putida -1.029388421
## Exponential:P. veronii-Stationary:P. putida -1.006574232
## Stationary:P. veronii-Stationary:P. putida -0.922392907
## Stationary:P. veronii-Exponential:P. veronii -0.151217267
## upr
## Stationary:P. grimontii-Exponential:P. grimontii 0.65692485
## Exponential:P. knackmussii-Exponential:P. grimontii 0.65362140
## Stationary:P. knackmussii-Exponential:P. grimontii 1.36260876
## Exponential:P. plecoglossicida-Exponential:P. grimontii 0.92093135
## Stationary:P. plecoglossicida-Exponential:P. grimontii 0.67971059
## Exponential:P. protegens-Exponential:P. grimontii 0.56182776
## Stationary:P. protegens-Exponential:P. grimontii 0.59361045
## Exponential:P. putida-Exponential:P. grimontii 1.10567538
## Stationary:P. putida-Exponential:P. grimontii 0.99775299
## Exponential:P. veronii-Exponential:P. grimontii 0.21973606
## Stationary:P. veronii-Exponential:P. grimontii 0.30391739
## Exponential:P. knackmussii-Stationary:P. grimontii 0.40441888
## Stationary:P. knackmussii-Stationary:P. grimontii 1.11340624
## Exponential:P. plecoglossicida-Stationary:P. grimontii 0.67172883
## Stationary:P. plecoglossicida-Stationary:P. grimontii 0.43050807
## Exponential:P. protegens-Stationary:P. grimontii 0.31262524
## Stationary:P. protegens-Stationary:P. grimontii 0.34440792
## Exponential:P. putida-Stationary:P. grimontii 0.85647285
## Stationary:P. putida-Stationary:P. grimontii 0.74855047
## Exponential:P. veronii-Stationary:P. grimontii -0.02946646
## Stationary:P. veronii-Stationary:P. grimontii 0.05471486
## Stationary:P. knackmussii-Exponential:P. knackmussii 0.99729058
## Exponential:P. plecoglossicida-Exponential:P. knackmussii 0.57228274
## Stationary:P. plecoglossicida-Exponential:P. knackmussii 0.32456264
## Exponential:P. protegens-Exponential:P. knackmussii 0.18864936
## Stationary:P. protegens-Exponential:P. knackmussii 0.22043205
## Exponential:P. putida-Exponential:P. knackmussii 0.73054329
## Stationary:P. putida-Exponential:P. knackmussii 0.62319550
## Exponential:P. veronii-Exponential:P. knackmussii -0.15050771
## Stationary:P. veronii-Exponential:P. knackmussii -0.06632638
## Exponential:P. plecoglossicida-Stationary:P. knackmussii -0.13670462
## Stationary:P. plecoglossicida-Stationary:P. knackmussii -0.38442472
## Exponential:P. protegens-Stationary:P. knackmussii -0.52033800
## Stationary:P. protegens-Stationary:P. knackmussii -0.48855531
## Exponential:P. putida-Stationary:P. knackmussii 0.02155593
## Stationary:P. putida-Stationary:P. knackmussii -0.08579186
## Exponential:P. veronii-Stationary:P. knackmussii -0.85949507
## Stationary:P. veronii-Stationary:P. knackmussii -0.77531374
## Stationary:P. plecoglossicida-Exponential:P. plecoglossicida 0.26275175
## Exponential:P. protegens-Exponential:P. plecoglossicida 0.15580034
## Stationary:P. protegens-Exponential:P. plecoglossicida 0.18758302
## Exponential:P. putida-Exponential:P. plecoglossicida 0.70067250
## Stationary:P. putida-Exponential:P. plecoglossicida 0.59245190
## Exponential:P. veronii-Exponential:P. plecoglossicida -0.18788735
## Stationary:P. veronii-Exponential:P. plecoglossicida -0.10370603
## Exponential:P. protegens-Stationary:P. plecoglossicida 0.28983950
## Stationary:P. protegens-Stationary:P. plecoglossicida 0.32162218
## Exponential:P. putida-Stationary:P. plecoglossicida 0.83368711
## Stationary:P. putida-Stationary:P. plecoglossicida 0.72576473
## Exponential:P. veronii-Stationary:P. plecoglossicida -0.05225221
## Stationary:P. veronii-Stationary:P. plecoglossicida 0.03192912
## Stationary:P. protegens-Exponential:P. protegens 0.23564385
## Exponential:P. putida-Exponential:P. protegens 0.74375974
## Stationary:P. putida-Exponential:P. protegens 0.63700888
## Exponential:P. veronii-Exponential:P. protegens -0.13246757
## Stationary:P. veronii-Exponential:P. protegens -0.04828624
## Exponential:P. putida-Stationary:P. protegens 0.71197705
## Stationary:P. putida-Stationary:P. protegens 0.60522620
## Exponential:P. veronii-Stationary:P. protegens -0.16425025
## Stationary:P. veronii-Stationary:P. protegens -0.08006892
## Stationary:P. putida-Exponential:P. putida 0.07576975
## Exponential:P. veronii-Exponential:P. putida -0.69247594
## Stationary:P. veronii-Exponential:P. putida -0.60829462
## Exponential:P. veronii-Stationary:P. putida -0.57987805
## Stationary:P. veronii-Stationary:P. putida -0.49569672
## Stationary:P. veronii-Exponential:P. veronii 0.31957992
## p adj
## Stationary:P. grimontii-Exponential:P. grimontii 0.6746408
## Exponential:P. knackmussii-Exponential:P. grimontii 0.1806581
## Stationary:P. knackmussii-Exponential:P. grimontii 0.0000000
## Exponential:P. plecoglossicida-Exponential:P. grimontii 0.0409978
## Stationary:P. plecoglossicida-Exponential:P. grimontii 0.5434764
## Exponential:P. protegens-Exponential:P. grimontii 0.3703550
## Stationary:P. protegens-Exponential:P. grimontii 0.1939033
## Exponential:P. putida-Exponential:P. grimontii 0.0000000
## Stationary:P. putida-Exponential:P. grimontii 0.0000000
## Exponential:P. veronii-Exponential:P. grimontii 0.9930277
## Stationary:P. veronii-Exponential:P. grimontii 1.0000000
## Exponential:P. knackmussii-Stationary:P. grimontii 0.9999981
## Stationary:P. knackmussii-Stationary:P. grimontii 0.0000000
## Exponential:P. plecoglossicida-Stationary:P. grimontii 0.9172152
## Stationary:P. plecoglossicida-Stationary:P. grimontii 1.0000000
## Exponential:P. protegens-Stationary:P. grimontii 1.0000000
## Stationary:P. protegens-Stationary:P. grimontii 1.0000000
## Exponential:P. putida-Stationary:P. grimontii 0.0000039
## Stationary:P. putida-Stationary:P. grimontii 0.0007759
## Exponential:P. veronii-Stationary:P. grimontii 0.0202282
## Stationary:P. veronii-Stationary:P. grimontii 0.2025634
## Stationary:P. knackmussii-Exponential:P. knackmussii 0.0000000
## Exponential:P. plecoglossicida-Exponential:P. knackmussii 0.9727301
## Stationary:P. plecoglossicida-Exponential:P. knackmussii 1.0000000
## Exponential:P. protegens-Exponential:P. knackmussii 0.9996461
## Stationary:P. protegens-Exponential:P. knackmussii 0.9999998
## Exponential:P. putida-Exponential:P. knackmussii 0.0000000
## Stationary:P. putida-Exponential:P. knackmussii 0.0000436
## Exponential:P. veronii-Exponential:P. knackmussii 0.0000352
## Stationary:P. veronii-Exponential:P. knackmussii 0.0030047
## Exponential:P. plecoglossicida-Stationary:P. knackmussii 0.0010262
## Stationary:P. plecoglossicida-Stationary:P. knackmussii 0.0000000
## Exponential:P. protegens-Stationary:P. knackmussii 0.0000000
## Stationary:P. protegens-Stationary:P. knackmussii 0.0000000
## Exponential:P. putida-Stationary:P. knackmussii 0.1123353
## Stationary:P. putida-Stationary:P. knackmussii 0.0008198
## Exponential:P. veronii-Stationary:P. knackmussii 0.0000000
## Stationary:P. veronii-Stationary:P. knackmussii 0.0000000
## Stationary:P. plecoglossicida-Exponential:P. plecoglossicida 0.9611623
## Exponential:P. protegens-Exponential:P. plecoglossicida 0.7184997
## Stationary:P. protegens-Exponential:P. plecoglossicida 0.8725510
## Exponential:P. putida-Exponential:P. plecoglossicida 0.1637669
## Stationary:P. putida-Exponential:P. plecoglossicida 0.7646889
## Exponential:P. veronii-Exponential:P. plecoglossicida 0.0001348
## Stationary:P. veronii-Exponential:P. plecoglossicida 0.0025308
## Exponential:P. protegens-Stationary:P. plecoglossicida 1.0000000
## Stationary:P. protegens-Stationary:P. plecoglossicida 1.0000000
## Exponential:P. putida-Stationary:P. plecoglossicida 0.0000124
## Stationary:P. putida-Stationary:P. plecoglossicida 0.0019920
## Exponential:P. veronii-Stationary:P. plecoglossicida 0.0094280
## Stationary:P. veronii-Stationary:P. plecoglossicida 0.1186691
## Stationary:P. protegens-Exponential:P. protegens 0.9999961
## Exponential:P. putida-Exponential:P. protegens 0.0000000
## Stationary:P. putida-Exponential:P. protegens 0.0000000
## Exponential:P. veronii-Exponential:P. protegens 0.0000224
## Stationary:P. veronii-Exponential:P. protegens 0.0045009
## Exponential:P. putida-Stationary:P. protegens 0.0000000
## Stationary:P. putida-Stationary:P. protegens 0.0000000
## Exponential:P. veronii-Stationary:P. protegens 0.0000023
## Stationary:P. veronii-Stationary:P. protegens 0.0007018
## Stationary:P. putida-Exponential:P. putida 0.7180840
## Exponential:P. veronii-Exponential:P. putida 0.0000000
## Stationary:P. veronii-Exponential:P. putida 0.0000000
## Exponential:P. veronii-Stationary:P. putida 0.0000000
## Stationary:P. veronii-Stationary:P. putida 0.0000000
## Stationary:P. veronii-Exponential:P. veronii 0.9894021
##
## $`Inoculum:Temp`
## diff lwr upr p adj
## Stationary:35-Exponential:35 0.10204958 -0.01138587 0.2154850 0.0943519
## Exponential:40-Exponential:35 -0.43397116 -0.54802790 -0.3199144 0.0000000
## Stationary:40-Exponential:35 -0.36936843 -0.48280388 -0.2559330 0.0000000
## Exponential:40-Stationary:35 -0.53602074 -0.65066972 -0.4213718 0.0000000
## Stationary:40-Stationary:35 -0.47141801 -0.58544893 -0.3573871 0.0000000
## Stationary:40-Exponential:40 0.06460273 -0.05004625 0.1792517 0.4625110
##
## $`Species:Temp`
## diff lwr
## P. knackmussii:35-P. grimontii:35 2.730456e-01 -0.08005231
## P. plecoglossicida:35-P. grimontii:35 2.305132e-01 -0.17720915
## P. protegens:35-P. grimontii:35 2.627356e-01 -0.05959720
## P. putida:35-P. grimontii:35 3.375641e-01 0.02083752
## P. veronii:35-P. grimontii:35 -3.901913e-01 -0.72309522
## P. grimontii:40-P. grimontii:35 -6.865781e-01 -1.09430046
## P. knackmussii:40-P. grimontii:35 1.012082e-01 -0.25188974
## P. plecoglossicida:40-P. grimontii:35 -6.621066e-01 -1.11795402
## P. protegens:40-P. grimontii:35 -6.877436e-01 -1.01007643
## P. putida:40-P. grimontii:35 2.030688e-01 -0.11365779
## P. veronii:40-P. grimontii:35 -6.877436e-01 -1.02064752
## P. plecoglossicida:35-P. knackmussii:35 -4.253241e-02 -0.39563029
## P. protegens:35-P. knackmussii:35 -1.030998e-02 -0.25998789
## P. putida:35-P. knackmussii:35 6.451853e-02 -0.17787857
## P. veronii:35-P. knackmussii:35 -6.632369e-01 -0.92642054
## P. grimontii:40-P. knackmussii:35 -9.596237e-01 -1.31272160
## P. knackmussii:40-P. knackmussii:35 -1.718374e-01 -0.46014064
## P. plecoglossicida:40-P. knackmussii:35 -9.351522e-01 -1.34287450
## P. protegens:40-P. knackmussii:35 -9.607892e-01 -1.21046712
## P. putida:40-P. knackmussii:35 -6.997678e-02 -0.31237389
## P. veronii:40-P. knackmussii:35 -9.607892e-01 -1.22397284
## P. protegens:35-P. plecoglossicida:35 3.222242e-02 -0.29011037
## P. putida:35-P. plecoglossicida:35 1.070509e-01 -0.20967565
## P. veronii:35-P. plecoglossicida:35 -6.207045e-01 -0.95360839
## P. grimontii:40-P. plecoglossicida:35 -9.170913e-01 -1.32481363
## P. knackmussii:40-P. plecoglossicida:35 -1.293050e-01 -0.48240291
## P. plecoglossicida:40-P. plecoglossicida:35 -8.926198e-01 -1.34846719
## P. protegens:40-P. plecoglossicida:35 -9.182568e-01 -1.24058960
## P. putida:40-P. plecoglossicida:35 -2.744438e-02 -0.34417096
## P. veronii:40-P. plecoglossicida:35 -9.182568e-01 -1.25116069
## P. putida:35-P. protegens:35 7.482851e-02 -0.12004752
## P. veronii:35-P. protegens:35 -6.529269e-01 -0.87312215
## P. grimontii:40-P. protegens:35 -9.493137e-01 -1.27164653
## P. knackmussii:40-P. protegens:35 -1.615274e-01 -0.41120535
## P. plecoglossicida:40-P. protegens:35 -9.248422e-01 -1.30623151
## P. protegens:40-P. protegens:35 -9.504792e-01 -1.15434039
## P. putida:40-P. protegens:35 -5.966680e-02 -0.25454283
## P. veronii:40-P. protegens:35 -9.504792e-01 -1.17067445
## P. veronii:35-P. putida:35 -7.277554e-01 -0.93965927
## P. grimontii:40-P. putida:35 -1.024142e+00 -1.34086882
## P. knackmussii:40-P. putida:35 -2.363560e-01 -0.47875305
## P. plecoglossicida:40-P. putida:35 -9.996707e-01 -1.37633382
## P. protegens:40-P. putida:35 -1.025308e+00 -1.22018378
## P. putida:40-P. putida:35 -1.344953e-01 -0.31995141
## P. veronii:40-P. putida:35 -1.025308e+00 -1.23721157
## P. grimontii:40-P. veronii:35 -2.963868e-01 -0.62929068
## P. knackmussii:40-P. veronii:35 4.913995e-01 0.22821586
## P. plecoglossicida:40-P. veronii:35 -2.719153e-01 -0.66227967
## P. protegens:40-P. veronii:35 -2.975523e-01 -0.51774752
## P. putida:40-P. veronii:35 5.932601e-01 0.38135631
## P. veronii:40-P. veronii:35 -2.975523e-01 -0.53295089
## P. knackmussii:40-P. grimontii:40 7.877863e-01 0.43468840
## P. plecoglossicida:40-P. grimontii:40 2.447153e-02 -0.43137588
## P. protegens:40-P. grimontii:40 -1.165501e-03 -0.32349830
## P. putida:40-P. grimontii:40 8.896469e-01 0.57292035
## P. veronii:40-P. grimontii:40 -1.165501e-03 -0.33406938
## P. plecoglossicida:40-P. knackmussii:40 -7.633148e-01 -1.17103708
## P. protegens:40-P. knackmussii:40 -7.889518e-01 -1.03862970
## P. putida:40-P. knackmussii:40 1.018606e-01 -0.14053646
## P. veronii:40-P. knackmussii:40 -7.889518e-01 -1.05213542
## P. protegens:40-P. plecoglossicida:40 -2.563703e-02 -0.40702634
## P. putida:40-P. plecoglossicida:40 8.651754e-01 0.48851228
## P. veronii:40-P. plecoglossicida:40 -2.563703e-02 -0.41600144
## P. putida:40-P. protegens:40 8.908124e-01 0.69593640
## P. veronii:40-P. protegens:40 -2.498002e-16 -0.22019522
## P. veronii:40-P. putida:40 -8.908124e-01 -1.10271625
## upr p adj
## P. knackmussii:35-P. grimontii:35 0.626143464 0.3089411
## P. plecoglossicida:35-P. grimontii:35 0.638235492 0.7729893
## P. protegens:35-P. grimontii:35 0.585068390 0.2344267
## P. putida:35-P. grimontii:35 0.654290687 0.0257536
## P. veronii:35-P. grimontii:35 -0.057287456 0.0079091
## P. grimontii:40-P. grimontii:35 -0.278855815 0.0000062
## P. knackmussii:40-P. grimontii:35 0.454306041 0.9984330
## P. plecoglossicida:40-P. grimontii:35 -0.206259189 0.0002040
## P. protegens:40-P. grimontii:35 -0.365410840 0.0000000
## P. putida:40-P. grimontii:35 0.519795373 0.6050602
## P. veronii:40-P. grimontii:35 -0.354839756 0.0000000
## P. plecoglossicida:35-P. knackmussii:35 0.310565483 0.9999997
## P. protegens:35-P. knackmussii:35 0.239367928 1.0000000
## P. putida:35-P. knackmussii:35 0.306915631 0.9992078
## P. veronii:35-P. knackmussii:35 -0.400053286 0.0000000
## P. grimontii:40-P. knackmussii:35 -0.606525824 0.0000000
## P. knackmussii:40-P. knackmussii:35 0.116465795 0.7085860
## P. plecoglossicida:40-P. knackmussii:35 -0.527429857 0.0000000
## P. protegens:40-P. knackmussii:35 -0.711111302 0.0000000
## P. putida:40-P. knackmussii:35 0.172420317 0.9983280
## P. veronii:40-P. knackmussii:35 -0.697605586 0.0000000
## P. protegens:35-P. plecoglossicida:35 0.354555220 1.0000000
## P. putida:35-P. plecoglossicida:35 0.423777517 0.9933565
## P. veronii:35-P. plecoglossicida:35 -0.287800626 0.0000003
## P. grimontii:40-P. plecoglossicida:35 -0.509368984 0.0000000
## P. knackmussii:40-P. plecoglossicida:35 0.223792871 0.9871627
## P. plecoglossicida:40-P. plecoglossicida:35 -0.436772359 0.0000001
## P. protegens:40-P. plecoglossicida:35 -0.595924010 0.0000000
## P. putida:40-P. plecoglossicida:35 0.289282204 1.0000000
## P. veronii:40-P. plecoglossicida:35 -0.585352926 0.0000000
## P. putida:35-P. protegens:35 0.269704545 0.9813423
## P. veronii:35-P. protegens:35 -0.432731710 0.0000000
## P. grimontii:40-P. protegens:35 -0.626980932 0.0000000
## P. knackmussii:40-P. protegens:35 0.088150471 0.5913481
## P. plecoglossicida:40-P. protegens:35 -0.543452887 0.0000000
## P. protegens:40-P. protegens:35 -0.746618069 0.0000000
## P. putida:40-P. protegens:35 0.135209232 0.9971693
## P. veronii:40-P. protegens:35 -0.730284010 0.0000000
## P. veronii:35-P. putida:35 -0.515851619 0.0000000
## P. grimontii:40-P. putida:35 -0.707415659 0.0000000
## P. knackmussii:40-P. putida:35 0.006041149 0.0633578
## P. plecoglossicida:40-P. putida:35 -0.623007595 0.0000000
## P. protegens:40-P. putida:35 -0.830431709 0.0000000
## P. putida:40-P. putida:35 0.050960783 0.4089311
## P. veronii:40-P. putida:35 -0.813403918 0.0000000
## P. grimontii:40-P. veronii:35 0.036517083 0.1329203
## P. knackmussii:40-P. veronii:35 0.754583117 0.0000003
## P. plecoglossicida:40-P. veronii:35 0.118449138 0.4740447
## P. protegens:40-P. veronii:35 -0.077357079 0.0008285
## P. putida:40-P. veronii:35 0.805163953 0.0000000
## P. veronii:40-P. veronii:35 -0.062153708 0.0025835
## P. knackmussii:40-P. grimontii:40 1.140884177 0.0000000
## P. plecoglossicida:40-P. grimontii:40 0.480318947 1.0000000
## P. protegens:40-P. grimontii:40 0.321167296 1.0000000
## P. putida:40-P. grimontii:40 1.206373510 0.0000000
## P. veronii:40-P. grimontii:40 0.331738381 1.0000000
## P. plecoglossicida:40-P. knackmussii:40 -0.355592434 0.0000003
## P. protegens:40-P. knackmussii:40 -0.539273878 0.0000000
## P. putida:40-P. knackmussii:40 0.344257741 0.9633326
## P. veronii:40-P. knackmussii:40 -0.525768163 0.0000000
## P. protegens:40-P. plecoglossicida:40 0.355752275 1.0000000
## P. putida:40-P. plecoglossicida:40 1.241838508 0.0000000
## P. veronii:40-P. plecoglossicida:40 0.364727369 1.0000000
## P. putida:40-P. protegens:40 1.085688462 0.0000000
## P. veronii:40-P. protegens:40 0.220195220 1.0000000
## P. veronii:40-P. putida:40 -0.678908605 0.0000000
##
## $`Inoculum:Species:Temp`
## diff
## Stationary:P. grimontii:35-Exponential:P. grimontii:35 5.123472e-01
## Exponential:P. knackmussii:35-Exponential:P. grimontii:35 3.137204e-01
## Stationary:P. knackmussii:35-Exponential:P. grimontii:35 7.447179e-01
## Exponential:P. plecoglossicida:35-Exponential:P. grimontii:35 5.689932e-01
## Stationary:P. plecoglossicida:35-Exponential:P. grimontii:35 4.658270e-01
## Exponential:P. protegens:35-Exponential:P. grimontii:35 4.813209e-01
## Stationary:P. protegens:35-Exponential:P. grimontii:35 5.564975e-01
## Exponential:P. putida:35-Exponential:P. grimontii:35 6.392554e-01
## Stationary:P. putida:35-Exponential:P. grimontii:35 5.415192e-01
## Exponential:P. veronii:35-Exponential:P. grimontii:35 -2.240046e-01
## Stationary:P. veronii:35-Exponential:P. grimontii:35 -4.403084e-02
## Exponential:P. grimontii:40-Exponential:P. grimontii:35 -4.255464e-01
## Stationary:P. grimontii:40-Exponential:P. grimontii:35 -4.278774e-01
## Exponential:P. knackmussii:40-Exponential:P. grimontii:35 -1.382198e-01
## Stationary:P. knackmussii:40-Exponential:P. grimontii:35 8.603686e-01
## Exponential:P. plecoglossicida:40-Exponential:P. grimontii:35 -4.278774e-01
## Stationary:P. plecoglossicida:40-Exponential:P. grimontii:35 -4.276739e-01
## Exponential:P. protegens:40-Exponential:P. grimontii:35 -4.278774e-01
## Stationary:P. protegens:40-Exponential:P. grimontii:35 -4.278774e-01
## Exponential:P. putida:40-Exponential:P. grimontii:35 5.151085e-01
## Stationary:P. putida:40-Exponential:P. grimontii:35 4.048624e-01
## Exponential:P. veronii:40-Exponential:P. grimontii:35 -4.278774e-01
## Stationary:P. veronii:40-Exponential:P. grimontii:35 -4.278774e-01
## Exponential:P. knackmussii:35-Stationary:P. grimontii:35 -1.986268e-01
## Stationary:P. knackmussii:35-Stationary:P. grimontii:35 2.323707e-01
## Exponential:P. plecoglossicida:35-Stationary:P. grimontii:35 5.664597e-02
## Stationary:P. plecoglossicida:35-Stationary:P. grimontii:35 -4.652021e-02
## Exponential:P. protegens:35-Stationary:P. grimontii:35 -3.102627e-02
## Stationary:P. protegens:35-Stationary:P. grimontii:35 4.415025e-02
## Exponential:P. putida:35-Stationary:P. grimontii:35 1.269082e-01
## Stationary:P. putida:35-Stationary:P. grimontii:35 2.917201e-02
## Exponential:P. veronii:35-Stationary:P. grimontii:35 -7.363518e-01
## Stationary:P. veronii:35-Stationary:P. grimontii:35 -5.563780e-01
## Exponential:P. grimontii:40-Stationary:P. grimontii:35 -9.378936e-01
## Stationary:P. grimontii:40-Stationary:P. grimontii:35 -9.402246e-01
## Exponential:P. knackmussii:40-Stationary:P. grimontii:35 -6.505670e-01
## Stationary:P. knackmussii:40-Stationary:P. grimontii:35 3.480214e-01
## Exponential:P. plecoglossicida:40-Stationary:P. grimontii:35 -9.402246e-01
## Stationary:P. plecoglossicida:40-Stationary:P. grimontii:35 -9.400211e-01
## Exponential:P. protegens:40-Stationary:P. grimontii:35 -9.402246e-01
## Stationary:P. protegens:40-Stationary:P. grimontii:35 -9.402246e-01
## Exponential:P. putida:40-Stationary:P. grimontii:35 2.761271e-03
## Stationary:P. putida:40-Stationary:P. grimontii:35 -1.074848e-01
## Exponential:P. veronii:40-Stationary:P. grimontii:35 -9.402246e-01
## Stationary:P. veronii:40-Stationary:P. grimontii:35 -9.402246e-01
## Stationary:P. knackmussii:35-Exponential:P. knackmussii:35 4.309975e-01
## Exponential:P. plecoglossicida:35-Exponential:P. knackmussii:35 2.552728e-01
## Stationary:P. plecoglossicida:35-Exponential:P. knackmussii:35 1.521066e-01
## Exponential:P. protegens:35-Exponential:P. knackmussii:35 1.676005e-01
## Stationary:P. protegens:35-Exponential:P. knackmussii:35 2.427770e-01
## Exponential:P. putida:35-Exponential:P. knackmussii:35 3.255350e-01
## Stationary:P. putida:35-Exponential:P. knackmussii:35 2.277988e-01
## Exponential:P. veronii:35-Exponential:P. knackmussii:35 -5.377251e-01
## Stationary:P. veronii:35-Exponential:P. knackmussii:35 -3.577513e-01
## Exponential:P. grimontii:40-Exponential:P. knackmussii:35 -7.392668e-01
## Stationary:P. grimontii:40-Exponential:P. knackmussii:35 -7.415978e-01
## Exponential:P. knackmussii:40-Exponential:P. knackmussii:35 -4.519402e-01
## Stationary:P. knackmussii:40-Exponential:P. knackmussii:35 5.466482e-01
## Exponential:P. plecoglossicida:40-Exponential:P. knackmussii:35 -7.415978e-01
## Stationary:P. plecoglossicida:40-Exponential:P. knackmussii:35 -7.413944e-01
## Exponential:P. protegens:40-Exponential:P. knackmussii:35 -7.415978e-01
## Stationary:P. protegens:40-Exponential:P. knackmussii:35 -7.415978e-01
## Exponential:P. putida:40-Exponential:P. knackmussii:35 2.013881e-01
## Stationary:P. putida:40-Exponential:P. knackmussii:35 9.114197e-02
## Exponential:P. veronii:40-Exponential:P. knackmussii:35 -7.415978e-01
## Stationary:P. veronii:40-Exponential:P. knackmussii:35 -7.415978e-01
## Exponential:P. plecoglossicida:35-Stationary:P. knackmussii:35 -1.757248e-01
## Stationary:P. plecoglossicida:35-Stationary:P. knackmussii:35 -2.788909e-01
## Exponential:P. protegens:35-Stationary:P. knackmussii:35 -2.633970e-01
## Stationary:P. protegens:35-Stationary:P. knackmussii:35 -1.882205e-01
## Exponential:P. putida:35-Stationary:P. knackmussii:35 -1.054625e-01
## Stationary:P. putida:35-Stationary:P. knackmussii:35 -2.031987e-01
## Exponential:P. veronii:35-Stationary:P. knackmussii:35 -9.687226e-01
## Stationary:P. veronii:35-Stationary:P. knackmussii:35 -7.887488e-01
## Exponential:P. grimontii:40-Stationary:P. knackmussii:35 -1.170264e+00
## Stationary:P. grimontii:40-Stationary:P. knackmussii:35 -1.172595e+00
## Exponential:P. knackmussii:40-Stationary:P. knackmussii:35 -8.829377e-01
## Stationary:P. knackmussii:40-Stationary:P. knackmussii:35 1.156506e-01
## Exponential:P. plecoglossicida:40-Stationary:P. knackmussii:35 -1.172595e+00
## Stationary:P. plecoglossicida:40-Stationary:P. knackmussii:35 -1.172392e+00
## Exponential:P. protegens:40-Stationary:P. knackmussii:35 -1.172595e+00
## Stationary:P. protegens:40-Stationary:P. knackmussii:35 -1.172595e+00
## Exponential:P. putida:40-Stationary:P. knackmussii:35 -2.296095e-01
## Stationary:P. putida:40-Stationary:P. knackmussii:35 -3.398555e-01
## Exponential:P. veronii:40-Stationary:P. knackmussii:35 -1.172595e+00
## Stationary:P. veronii:40-Stationary:P. knackmussii:35 -1.172595e+00
## Stationary:P. plecoglossicida:35-Exponential:P. plecoglossicida:35 -1.031662e-01
## Exponential:P. protegens:35-Exponential:P. plecoglossicida:35 -8.767224e-02
## Stationary:P. protegens:35-Exponential:P. plecoglossicida:35 -1.249572e-02
## Exponential:P. putida:35-Exponential:P. plecoglossicida:35 7.026221e-02
## Stationary:P. putida:35-Exponential:P. plecoglossicida:35 -2.747396e-02
## Exponential:P. veronii:35-Exponential:P. plecoglossicida:35 -7.929978e-01
## Stationary:P. veronii:35-Exponential:P. plecoglossicida:35 -6.130240e-01
## Exponential:P. grimontii:40-Exponential:P. plecoglossicida:35 -9.945396e-01
## Stationary:P. grimontii:40-Exponential:P. plecoglossicida:35 -9.968706e-01
## Exponential:P. knackmussii:40-Exponential:P. plecoglossicida:35 -7.072129e-01
## Stationary:P. knackmussii:40-Exponential:P. plecoglossicida:35 2.913754e-01
## Exponential:P. plecoglossicida:40-Exponential:P. plecoglossicida:35 -9.968706e-01
## Stationary:P. plecoglossicida:40-Exponential:P. plecoglossicida:35 -9.966671e-01
## Exponential:P. protegens:40-Exponential:P. plecoglossicida:35 -9.968706e-01
## Stationary:P. protegens:40-Exponential:P. plecoglossicida:35 -9.968706e-01
## Exponential:P. putida:40-Exponential:P. plecoglossicida:35 -5.388470e-02
## Stationary:P. putida:40-Exponential:P. plecoglossicida:35 -1.641308e-01
## Exponential:P. veronii:40-Exponential:P. plecoglossicida:35 -9.968706e-01
## Stationary:P. veronii:40-Exponential:P. plecoglossicida:35 -9.968706e-01
## Exponential:P. protegens:35-Stationary:P. plecoglossicida:35 1.549394e-02
## Stationary:P. protegens:35-Stationary:P. plecoglossicida:35 9.067046e-02
## Exponential:P. putida:35-Stationary:P. plecoglossicida:35 1.734284e-01
## Stationary:P. putida:35-Stationary:P. plecoglossicida:35 7.569222e-02
## Exponential:P. veronii:35-Stationary:P. plecoglossicida:35 -6.898316e-01
## Stationary:P. veronii:35-Stationary:P. plecoglossicida:35 -5.098578e-01
## Exponential:P. grimontii:40-Stationary:P. plecoglossicida:35 -8.913734e-01
## Stationary:P. grimontii:40-Stationary:P. plecoglossicida:35 -8.937044e-01
## Exponential:P. knackmussii:40-Stationary:P. plecoglossicida:35 -6.040468e-01
## Stationary:P. knackmussii:40-Stationary:P. plecoglossicida:35 3.945416e-01
## Exponential:P. plecoglossicida:40-Stationary:P. plecoglossicida:35 -8.937044e-01
## Stationary:P. plecoglossicida:40-Stationary:P. plecoglossicida:35 -8.935009e-01
## Exponential:P. protegens:40-Stationary:P. plecoglossicida:35 -8.937044e-01
## Stationary:P. protegens:40-Stationary:P. plecoglossicida:35 -8.937044e-01
## Exponential:P. putida:40-Stationary:P. plecoglossicida:35 4.928148e-02
## Stationary:P. putida:40-Stationary:P. plecoglossicida:35 -6.096461e-02
## Exponential:P. veronii:40-Stationary:P. plecoglossicida:35 -8.937044e-01
## Stationary:P. veronii:40-Stationary:P. plecoglossicida:35 -8.937044e-01
## Stationary:P. protegens:35-Exponential:P. protegens:35 7.517652e-02
## Exponential:P. putida:35-Exponential:P. protegens:35 1.579345e-01
## Stationary:P. putida:35-Exponential:P. protegens:35 6.019828e-02
## Exponential:P. veronii:35-Exponential:P. protegens:35 -7.053256e-01
## Stationary:P. veronii:35-Exponential:P. protegens:35 -5.253518e-01
## Exponential:P. grimontii:40-Exponential:P. protegens:35 -9.068673e-01
## Stationary:P. grimontii:40-Exponential:P. protegens:35 -9.091983e-01
## Exponential:P. knackmussii:40-Exponential:P. protegens:35 -6.195407e-01
## Stationary:P. knackmussii:40-Exponential:P. protegens:35 3.790476e-01
## Exponential:P. plecoglossicida:40-Exponential:P. protegens:35 -9.091983e-01
## Stationary:P. plecoglossicida:40-Exponential:P. protegens:35 -9.089949e-01
## Exponential:P. protegens:40-Exponential:P. protegens:35 -9.091983e-01
## Stationary:P. protegens:40-Exponential:P. protegens:35 -9.091983e-01
## Exponential:P. putida:40-Exponential:P. protegens:35 3.378754e-02
## Stationary:P. putida:40-Exponential:P. protegens:35 -7.645855e-02
## Exponential:P. veronii:40-Exponential:P. protegens:35 -9.091983e-01
## Stationary:P. veronii:40-Exponential:P. protegens:35 -9.091983e-01
## Exponential:P. putida:35-Stationary:P. protegens:35 8.275793e-02
## Stationary:P. putida:35-Stationary:P. protegens:35 -1.497824e-02
## Exponential:P. veronii:35-Stationary:P. protegens:35 -7.805021e-01
## Stationary:P. veronii:35-Stationary:P. protegens:35 -6.005283e-01
## Exponential:P. grimontii:40-Stationary:P. protegens:35 -9.820438e-01
## Stationary:P. grimontii:40-Stationary:P. protegens:35 -9.843748e-01
## Exponential:P. knackmussii:40-Stationary:P. protegens:35 -6.947172e-01
## Stationary:P. knackmussii:40-Stationary:P. protegens:35 3.038711e-01
## Exponential:P. plecoglossicida:40-Stationary:P. protegens:35 -9.843748e-01
## Stationary:P. plecoglossicida:40-Stationary:P. protegens:35 -9.841714e-01
## Exponential:P. protegens:40-Stationary:P. protegens:35 -9.843748e-01
## Stationary:P. protegens:40-Stationary:P. protegens:35 -9.843748e-01
## Exponential:P. putida:40-Stationary:P. protegens:35 -4.138898e-02
## Stationary:P. putida:40-Stationary:P. protegens:35 -1.516351e-01
## Exponential:P. veronii:40-Stationary:P. protegens:35 -9.843748e-01
## Stationary:P. veronii:40-Stationary:P. protegens:35 -9.843748e-01
## Stationary:P. putida:35-Exponential:P. putida:35 -9.773617e-02
## Exponential:P. veronii:35-Exponential:P. putida:35 -8.632600e-01
## Stationary:P. veronii:35-Exponential:P. putida:35 -6.832862e-01
## Exponential:P. grimontii:40-Exponential:P. putida:35 -1.064802e+00
## Stationary:P. grimontii:40-Exponential:P. putida:35 -1.067133e+00
## Exponential:P. knackmussii:40-Exponential:P. putida:35 -7.774752e-01
## Stationary:P. knackmussii:40-Exponential:P. putida:35 2.211132e-01
## Exponential:P. plecoglossicida:40-Exponential:P. putida:35 -1.067133e+00
## Stationary:P. plecoglossicida:40-Exponential:P. putida:35 -1.066929e+00
## Exponential:P. protegens:40-Exponential:P. putida:35 -1.067133e+00
## Stationary:P. protegens:40-Exponential:P. putida:35 -1.067133e+00
## Exponential:P. putida:40-Exponential:P. putida:35 -1.241469e-01
## Stationary:P. putida:40-Exponential:P. putida:35 -2.343930e-01
## Exponential:P. veronii:40-Exponential:P. putida:35 -1.067133e+00
## Stationary:P. veronii:40-Exponential:P. putida:35 -1.067133e+00
## Exponential:P. veronii:35-Stationary:P. putida:35 -7.655238e-01
## Stationary:P. veronii:35-Stationary:P. putida:35 -5.855500e-01
## Exponential:P. grimontii:40-Stationary:P. putida:35 -9.670656e-01
## Stationary:P. grimontii:40-Stationary:P. putida:35 -9.693966e-01
## Exponential:P. knackmussii:40-Stationary:P. putida:35 -6.797390e-01
## Stationary:P. knackmussii:40-Stationary:P. putida:35 3.188494e-01
## Exponential:P. plecoglossicida:40-Stationary:P. putida:35 -9.693966e-01
## Stationary:P. plecoglossicida:40-Stationary:P. putida:35 -9.691931e-01
## Exponential:P. protegens:40-Stationary:P. putida:35 -9.693966e-01
## Stationary:P. protegens:40-Stationary:P. putida:35 -9.693966e-01
## Exponential:P. putida:40-Stationary:P. putida:35 -2.641074e-02
## Stationary:P. putida:40-Stationary:P. putida:35 -1.366568e-01
## Exponential:P. veronii:40-Stationary:P. putida:35 -9.693966e-01
## Stationary:P. veronii:40-Stationary:P. putida:35 -9.693966e-01
## Stationary:P. veronii:35-Exponential:P. veronii:35 1.799738e-01
## Exponential:P. grimontii:40-Exponential:P. veronii:35 -2.015417e-01
## Stationary:P. grimontii:40-Exponential:P. veronii:35 -2.038727e-01
## Exponential:P. knackmussii:40-Exponential:P. veronii:35 8.578486e-02
## Stationary:P. knackmussii:40-Exponential:P. veronii:35 1.084373e+00
## Exponential:P. plecoglossicida:40-Exponential:P. veronii:35 -2.038727e-01
## Stationary:P. plecoglossicida:40-Exponential:P. veronii:35 -2.036693e-01
## Exponential:P. protegens:40-Exponential:P. veronii:35 -2.038727e-01
## Stationary:P. protegens:40-Exponential:P. veronii:35 -2.038727e-01
## Exponential:P. putida:40-Exponential:P. veronii:35 7.391131e-01
## Stationary:P. putida:40-Exponential:P. veronii:35 6.288670e-01
## Exponential:P. veronii:40-Exponential:P. veronii:35 -2.038727e-01
## Stationary:P. veronii:40-Exponential:P. veronii:35 -2.038727e-01
## Exponential:P. grimontii:40-Stationary:P. veronii:35 -3.815155e-01
## Stationary:P. grimontii:40-Stationary:P. veronii:35 -3.838465e-01
## Exponential:P. knackmussii:40-Stationary:P. veronii:35 -9.418894e-02
## Stationary:P. knackmussii:40-Stationary:P. veronii:35 9.043994e-01
## Exponential:P. plecoglossicida:40-Stationary:P. veronii:35 -3.838465e-01
## Stationary:P. plecoglossicida:40-Stationary:P. veronii:35 -3.836431e-01
## Exponential:P. protegens:40-Stationary:P. veronii:35 -3.838465e-01
## Stationary:P. protegens:40-Stationary:P. veronii:35 -3.838465e-01
## Exponential:P. putida:40-Stationary:P. veronii:35 5.591393e-01
## Stationary:P. putida:40-Stationary:P. veronii:35 4.488932e-01
## Exponential:P. veronii:40-Stationary:P. veronii:35 -3.838465e-01
## Stationary:P. veronii:40-Stationary:P. veronii:35 -3.838465e-01
## Stationary:P. grimontii:40-Exponential:P. grimontii:40 -2.331002e-03
## Exponential:P. knackmussii:40-Exponential:P. grimontii:40 2.873266e-01
## Stationary:P. knackmussii:40-Exponential:P. grimontii:40 1.285915e+00
## Exponential:P. plecoglossicida:40-Exponential:P. grimontii:40 -2.331002e-03
## Stationary:P. plecoglossicida:40-Exponential:P. grimontii:40 -2.127552e-03
## Exponential:P. protegens:40-Exponential:P. grimontii:40 -2.331002e-03
## Stationary:P. protegens:40-Exponential:P. grimontii:40 -2.331002e-03
## Exponential:P. putida:40-Exponential:P. grimontii:40 9.406549e-01
## Stationary:P. putida:40-Exponential:P. grimontii:40 8.304088e-01
## Exponential:P. veronii:40-Exponential:P. grimontii:40 -2.331002e-03
## Stationary:P. veronii:40-Exponential:P. grimontii:40 -2.331002e-03
## Exponential:P. knackmussii:40-Stationary:P. grimontii:40 2.896576e-01
## Stationary:P. knackmussii:40-Stationary:P. grimontii:40 1.288246e+00
## Exponential:P. plecoglossicida:40-Stationary:P. grimontii:40 -1.110223e-15
## Stationary:P. plecoglossicida:40-Stationary:P. grimontii:40 2.034505e-04
## Exponential:P. protegens:40-Stationary:P. grimontii:40 1.901257e-15
## Stationary:P. protegens:40-Stationary:P. grimontii:40 1.998401e-15
## Exponential:P. putida:40-Stationary:P. grimontii:40 9.429859e-01
## Stationary:P. putida:40-Stationary:P. grimontii:40 8.327398e-01
## Exponential:P. veronii:40-Stationary:P. grimontii:40 2.053913e-15
## Stationary:P. veronii:40-Stationary:P. grimontii:40 1.235123e-15
## Stationary:P. knackmussii:40-Exponential:P. knackmussii:40 9.985884e-01
## Exponential:P. plecoglossicida:40-Exponential:P. knackmussii:40 -2.896576e-01
## Stationary:P. plecoglossicida:40-Exponential:P. knackmussii:40 -2.894542e-01
## Exponential:P. protegens:40-Exponential:P. knackmussii:40 -2.896576e-01
## Stationary:P. protegens:40-Exponential:P. knackmussii:40 -2.896576e-01
## Exponential:P. putida:40-Exponential:P. knackmussii:40 6.533282e-01
## Stationary:P. putida:40-Exponential:P. knackmussii:40 5.430822e-01
## Exponential:P. veronii:40-Exponential:P. knackmussii:40 -2.896576e-01
## Stationary:P. veronii:40-Exponential:P. knackmussii:40 -2.896576e-01
## Exponential:P. plecoglossicida:40-Stationary:P. knackmussii:40 -1.288246e+00
## Stationary:P. plecoglossicida:40-Stationary:P. knackmussii:40 -1.288043e+00
## Exponential:P. protegens:40-Stationary:P. knackmussii:40 -1.288246e+00
## Stationary:P. protegens:40-Stationary:P. knackmussii:40 -1.288246e+00
## Exponential:P. putida:40-Stationary:P. knackmussii:40 -3.452601e-01
## Stationary:P. putida:40-Stationary:P. knackmussii:40 -4.555062e-01
## Exponential:P. veronii:40-Stationary:P. knackmussii:40 -1.288246e+00
## Stationary:P. veronii:40-Stationary:P. knackmussii:40 -1.288246e+00
## Stationary:P. plecoglossicida:40-Exponential:P. plecoglossicida:40 2.034505e-04
## Exponential:P. protegens:40-Exponential:P. plecoglossicida:40 3.011480e-15
## Stationary:P. protegens:40-Exponential:P. plecoglossicida:40 3.108624e-15
## Exponential:P. putida:40-Exponential:P. plecoglossicida:40 9.429859e-01
## Stationary:P. putida:40-Exponential:P. plecoglossicida:40 8.327398e-01
## Exponential:P. veronii:40-Exponential:P. plecoglossicida:40 3.164136e-15
## Stationary:P. veronii:40-Exponential:P. plecoglossicida:40 2.345346e-15
## Exponential:P. protegens:40-Stationary:P. plecoglossicida:40 -2.034505e-04
## Stationary:P. protegens:40-Stationary:P. plecoglossicida:40 -2.034505e-04
## Exponential:P. putida:40-Stationary:P. plecoglossicida:40 9.427824e-01
## Stationary:P. putida:40-Stationary:P. plecoglossicida:40 8.325363e-01
## Exponential:P. veronii:40-Stationary:P. plecoglossicida:40 -2.034505e-04
## Stationary:P. veronii:40-Stationary:P. plecoglossicida:40 -2.034505e-04
## Stationary:P. protegens:40-Exponential:P. protegens:40 9.714451e-17
## Exponential:P. putida:40-Exponential:P. protegens:40 9.429859e-01
## Stationary:P. putida:40-Exponential:P. protegens:40 8.327398e-01
## Exponential:P. veronii:40-Exponential:P. protegens:40 1.526557e-16
## Stationary:P. veronii:40-Exponential:P. protegens:40 -6.661338e-16
## Exponential:P. putida:40-Stationary:P. protegens:40 9.429859e-01
## Stationary:P. putida:40-Stationary:P. protegens:40 8.327398e-01
## Exponential:P. veronii:40-Stationary:P. protegens:40 5.551115e-17
## Stationary:P. veronii:40-Stationary:P. protegens:40 -7.632783e-16
## Stationary:P. putida:40-Exponential:P. putida:40 -1.102461e-01
## Exponential:P. veronii:40-Exponential:P. putida:40 -9.429859e-01
## Stationary:P. veronii:40-Exponential:P. putida:40 -9.429859e-01
## Exponential:P. veronii:40-Stationary:P. putida:40 -8.327398e-01
## Stationary:P. veronii:40-Stationary:P. putida:40 -8.327398e-01
## Stationary:P. veronii:40-Exponential:P. veronii:40 -8.187895e-16
## lwr
## Stationary:P. grimontii:35-Exponential:P. grimontii:35 -0.13113211
## Exponential:P. knackmussii:35-Exponential:P. grimontii:35 -0.24354901
## Stationary:P. knackmussii:35-Exponential:P. grimontii:35 0.18744851
## Exponential:P. plecoglossicida:35-Exponential:P. grimontii:35 -0.07448613
## Stationary:P. plecoglossicida:35-Exponential:P. grimontii:35 -0.17765231
## Exponential:P. protegens:35-Exponential:P. grimontii:35 -0.02739413
## Stationary:P. protegens:35-Exponential:P. grimontii:35 0.04778239
## Exponential:P. putida:35-Exponential:P. grimontii:35 0.14081846
## Stationary:P. putida:35-Exponential:P. grimontii:35 0.04012418
## Exponential:P. veronii:35-Exponential:P. grimontii:35 -0.74940329
## Stationary:P. veronii:35-Exponential:P. grimontii:35 -0.56942949
## Exponential:P. grimontii:40-Exponential:P. grimontii:35 -1.06902569
## Stationary:P. grimontii:40-Exponential:P. grimontii:35 -1.07135669
## Exponential:P. knackmussii:40-Exponential:P. grimontii:35 -0.69548920
## Stationary:P. knackmussii:40-Exponential:P. grimontii:35 0.30309915
## Exponential:P. plecoglossicida:40-Exponential:P. grimontii:35 -1.33789455
## Stationary:P. plecoglossicida:40-Exponential:P. grimontii:35 -1.07115324
## Exponential:P. protegens:40-Exponential:P. grimontii:35 -0.93659245
## Stationary:P. protegens:40-Exponential:P. grimontii:35 -0.93659245
## Exponential:P. putida:40-Exponential:P. grimontii:35 0.01667154
## Stationary:P. putida:40-Exponential:P. grimontii:35 -0.09653265
## Exponential:P. veronii:40-Exponential:P. grimontii:35 -0.95327604
## Stationary:P. veronii:40-Exponential:P. grimontii:35 -0.95327604
## Exponential:P. knackmussii:35-Stationary:P. grimontii:35 -0.75589621
## Stationary:P. knackmussii:35-Stationary:P. grimontii:35 -0.32489870
## Exponential:P. plecoglossicida:35-Stationary:P. grimontii:35 -0.58683334
## Stationary:P. plecoglossicida:35-Stationary:P. grimontii:35 -0.68999952
## Exponential:P. protegens:35-Stationary:P. grimontii:35 -0.53974133
## Stationary:P. protegens:35-Stationary:P. grimontii:35 -0.46456481
## Exponential:P. putida:35-Stationary:P. grimontii:35 -0.37152875
## Stationary:P. putida:35-Stationary:P. grimontii:35 -0.47222303
## Exponential:P. veronii:35-Stationary:P. grimontii:35 -1.26175049
## Stationary:P. veronii:35-Stationary:P. grimontii:35 -1.08177669
## Exponential:P. grimontii:40-Stationary:P. grimontii:35 -1.58137289
## Stationary:P. grimontii:40-Stationary:P. grimontii:35 -1.58370390
## Exponential:P. knackmussii:40-Stationary:P. grimontii:35 -1.20783640
## Stationary:P. knackmussii:40-Stationary:P. grimontii:35 -0.20924805
## Exponential:P. plecoglossicida:40-Stationary:P. grimontii:35 -1.85024175
## Stationary:P. plecoglossicida:40-Stationary:P. grimontii:35 -1.58350045
## Exponential:P. protegens:40-Stationary:P. grimontii:35 -1.44893965
## Stationary:P. protegens:40-Stationary:P. grimontii:35 -1.44893965
## Exponential:P. putida:40-Stationary:P. grimontii:35 -0.49567566
## Stationary:P. putida:40-Stationary:P. grimontii:35 -0.60887985
## Exponential:P. veronii:40-Stationary:P. grimontii:35 -1.46562324
## Stationary:P. veronii:40-Stationary:P. grimontii:35 -1.46562324
## Stationary:P. knackmussii:35-Exponential:P. knackmussii:35 -0.02401107
## Exponential:P. plecoglossicida:35-Exponential:P. knackmussii:35 -0.30199667
## Stationary:P. plecoglossicida:35-Exponential:P. knackmussii:35 -0.40516285
## Exponential:P. protegens:35-Exponential:P. knackmussii:35 -0.22644848
## Stationary:P. protegens:35-Exponential:P. knackmussii:35 -0.15127196
## Exponential:P. putida:35-Exponential:P. knackmussii:35 -0.05515253
## Stationary:P. putida:35-Exponential:P. knackmussii:35 -0.15675365
## Exponential:P. veronii:35-Exponential:P. knackmussii:35 -0.95308916
## Stationary:P. veronii:35-Exponential:P. knackmussii:35 -0.77311536
## Exponential:P. grimontii:40-Exponential:P. knackmussii:35 -1.29653623
## Stationary:P. grimontii:40-Exponential:P. knackmussii:35 -1.29886723
## Exponential:P. knackmussii:40-Exponential:P. knackmussii:35 -0.90694878
## Stationary:P. knackmussii:40-Exponential:P. knackmussii:35 0.09163958
## Exponential:P. plecoglossicida:40-Exponential:P. knackmussii:35 -1.59284092
## Stationary:P. plecoglossicida:40-Exponential:P. knackmussii:35 -1.29866378
## Exponential:P. protegens:40-Exponential:P. knackmussii:35 -1.13564680
## Stationary:P. protegens:40-Exponential:P. knackmussii:35 -1.13564680
## Exponential:P. putida:40-Exponential:P. knackmussii:35 -0.17929944
## Stationary:P. putida:40-Exponential:P. knackmussii:35 -0.29341047
## Exponential:P. veronii:40-Exponential:P. knackmussii:35 -1.15696191
## Stationary:P. veronii:40-Exponential:P. knackmussii:35 -1.15696191
## Exponential:P. plecoglossicida:35-Stationary:P. knackmussii:35 -0.73299419
## Stationary:P. plecoglossicida:35-Stationary:P. knackmussii:35 -0.83616037
## Exponential:P. protegens:35-Stationary:P. knackmussii:35 -0.65744599
## Stationary:P. protegens:35-Stationary:P. knackmussii:35 -0.58226947
## Exponential:P. putida:35-Stationary:P. knackmussii:35 -0.48615004
## Stationary:P. putida:35-Stationary:P. knackmussii:35 -0.58775116
## Exponential:P. veronii:35-Stationary:P. knackmussii:35 -1.38408668
## Stationary:P. veronii:35-Stationary:P. knackmussii:35 -1.20411288
## Exponential:P. grimontii:40-Stationary:P. knackmussii:35 -1.72753374
## Stationary:P. grimontii:40-Stationary:P. knackmussii:35 -1.72986475
## Exponential:P. knackmussii:40-Stationary:P. knackmussii:35 -1.33794629
## Stationary:P. knackmussii:40-Stationary:P. knackmussii:35 -0.33935794
## Exponential:P. plecoglossicida:40-Stationary:P. knackmussii:35 -2.02383843
## Stationary:P. plecoglossicida:40-Stationary:P. knackmussii:35 -1.72966130
## Exponential:P. protegens:40-Stationary:P. knackmussii:35 -1.56664431
## Stationary:P. protegens:40-Stationary:P. knackmussii:35 -1.56664431
## Exponential:P. putida:40-Stationary:P. knackmussii:35 -0.61029695
## Stationary:P. putida:40-Stationary:P. knackmussii:35 -0.72440799
## Exponential:P. veronii:40-Stationary:P. knackmussii:35 -1.58795943
## Stationary:P. veronii:40-Stationary:P. knackmussii:35 -1.58795943
## Stationary:P. plecoglossicida:35-Exponential:P. plecoglossicida:35 -0.74664549
## Exponential:P. protegens:35-Exponential:P. plecoglossicida:35 -0.59638730
## Stationary:P. protegens:35-Exponential:P. plecoglossicida:35 -0.52121078
## Exponential:P. putida:35-Exponential:P. plecoglossicida:35 -0.42817472
## Stationary:P. putida:35-Exponential:P. plecoglossicida:35 -0.52886900
## Exponential:P. veronii:35-Exponential:P. plecoglossicida:35 -1.31839647
## Stationary:P. veronii:35-Exponential:P. plecoglossicida:35 -1.13842267
## Exponential:P. grimontii:40-Exponential:P. plecoglossicida:35 -1.63801887
## Stationary:P. grimontii:40-Exponential:P. plecoglossicida:35 -1.64034987
## Exponential:P. knackmussii:40-Exponential:P. plecoglossicida:35 -1.26448238
## Stationary:P. knackmussii:40-Exponential:P. plecoglossicida:35 -0.26589402
## Exponential:P. plecoglossicida:40-Exponential:P. plecoglossicida:35 -1.90688773
## Stationary:P. plecoglossicida:40-Exponential:P. plecoglossicida:35 -1.64014642
## Exponential:P. protegens:40-Exponential:P. plecoglossicida:35 -1.50558562
## Stationary:P. protegens:40-Exponential:P. plecoglossicida:35 -1.50558562
## Exponential:P. putida:40-Exponential:P. plecoglossicida:35 -0.55232163
## Stationary:P. putida:40-Exponential:P. plecoglossicida:35 -0.66552583
## Exponential:P. veronii:40-Exponential:P. plecoglossicida:35 -1.52226922
## Stationary:P. veronii:40-Exponential:P. plecoglossicida:35 -1.52226922
## Exponential:P. protegens:35-Stationary:P. plecoglossicida:35 -0.49322112
## Stationary:P. protegens:35-Stationary:P. plecoglossicida:35 -0.41804460
## Exponential:P. putida:35-Stationary:P. plecoglossicida:35 -0.32500854
## Stationary:P. putida:35-Stationary:P. plecoglossicida:35 -0.42570282
## Exponential:P. veronii:35-Stationary:P. plecoglossicida:35 -1.21523029
## Stationary:P. veronii:35-Stationary:P. plecoglossicida:35 -1.03525648
## Exponential:P. grimontii:40-Stationary:P. plecoglossicida:35 -1.53485269
## Stationary:P. grimontii:40-Stationary:P. plecoglossicida:35 -1.53718369
## Exponential:P. knackmussii:40-Stationary:P. plecoglossicida:35 -1.16131619
## Stationary:P. knackmussii:40-Stationary:P. plecoglossicida:35 -0.16272784
## Exponential:P. plecoglossicida:40-Stationary:P. plecoglossicida:35 -1.80372154
## Stationary:P. plecoglossicida:40-Stationary:P. plecoglossicida:35 -1.53698024
## Exponential:P. protegens:40-Stationary:P. plecoglossicida:35 -1.40241944
## Stationary:P. protegens:40-Stationary:P. plecoglossicida:35 -1.40241944
## Exponential:P. putida:40-Stationary:P. plecoglossicida:35 -0.44915545
## Stationary:P. putida:40-Stationary:P. plecoglossicida:35 -0.56235964
## Exponential:P. veronii:40-Stationary:P. plecoglossicida:35 -1.41910303
## Stationary:P. veronii:40-Stationary:P. plecoglossicida:35 -1.41910303
## Stationary:P. protegens:35-Exponential:P. protegens:35 -0.24656313
## Exponential:P. putida:35-Exponential:P. protegens:35 -0.14729458
## Stationary:P. putida:35-Exponential:P. protegens:35 -0.24983781
## Exponential:P. veronii:35-Exponential:P. protegens:35 -1.05284412
## Stationary:P. veronii:35-Exponential:P. protegens:35 -0.87287032
## Exponential:P. grimontii:40-Exponential:P. protegens:35 -1.41558238
## Stationary:P. grimontii:40-Exponential:P. protegens:35 -1.41791338
## Exponential:P. knackmussii:40-Exponential:P. protegens:35 -1.01358970
## Stationary:P. knackmussii:40-Exponential:P. protegens:35 -0.01500134
## Exponential:P. plecoglossicida:40-Exponential:P. protegens:35 -1.72947671
## Stationary:P. plecoglossicida:40-Exponential:P. protegens:35 -1.41770993
## Exponential:P. protegens:40-Exponential:P. protegens:35 -1.23093797
## Stationary:P. protegens:40-Exponential:P. protegens:35 -1.23093797
## Exponential:P. putida:40-Exponential:P. protegens:35 -0.27144150
## Stationary:P. putida:40-Exponential:P. protegens:35 -0.38649464
## Exponential:P. veronii:40-Exponential:P. protegens:35 -1.25671686
## Stationary:P. veronii:40-Exponential:P. protegens:35 -1.25671686
## Exponential:P. putida:35-Stationary:P. protegens:35 -0.22247110
## Stationary:P. putida:35-Stationary:P. protegens:35 -0.32501433
## Exponential:P. veronii:35-Stationary:P. protegens:35 -1.12802064
## Stationary:P. veronii:35-Stationary:P. protegens:35 -0.94804683
## Exponential:P. grimontii:40-Stationary:P. protegens:35 -1.49075890
## Stationary:P. grimontii:40-Stationary:P. protegens:35 -1.49308990
## Exponential:P. knackmussii:40-Stationary:P. protegens:35 -1.08876622
## Stationary:P. knackmussii:40-Stationary:P. protegens:35 -0.09017786
## Exponential:P. plecoglossicida:40-Stationary:P. protegens:35 -1.80465323
## Stationary:P. plecoglossicida:40-Stationary:P. protegens:35 -1.49288645
## Exponential:P. protegens:40-Stationary:P. protegens:35 -1.30611449
## Stationary:P. protegens:40-Stationary:P. protegens:35 -1.30611449
## Exponential:P. putida:40-Stationary:P. protegens:35 -0.34661802
## Stationary:P. putida:40-Stationary:P. protegens:35 -0.46167116
## Exponential:P. veronii:40-Stationary:P. protegens:35 -1.33189338
## Stationary:P. veronii:40-Stationary:P. protegens:35 -1.33189338
## Stationary:P. putida:35-Exponential:P. putida:35 -0.39060259
## Exponential:P. veronii:35-Exponential:P. putida:35 -1.19555131
## Stationary:P. veronii:35-Exponential:P. putida:35 -1.01557751
## Exponential:P. grimontii:40-Exponential:P. putida:35 -1.56323870
## Stationary:P. grimontii:40-Exponential:P. putida:35 -1.56556970
## Exponential:P. knackmussii:40-Exponential:P. putida:35 -1.15816265
## Stationary:P. knackmussii:40-Exponential:P. putida:35 -0.15957430
## Exponential:P. plecoglossicida:40-Exponential:P. putida:35 -1.88107687
## Stationary:P. plecoglossicida:40-Exponential:P. putida:35 -1.56536625
## Exponential:P. protegens:40-Exponential:P. putida:35 -1.37236181
## Stationary:P. protegens:40-Exponential:P. putida:35 -1.37236181
## Exponential:P. putida:40-Exponential:P. putida:35 -0.41191961
## Stationary:P. putida:40-Exponential:P. putida:35 -0.52725941
## Exponential:P. veronii:40-Exponential:P. putida:35 -1.39942406
## Stationary:P. veronii:40-Exponential:P. putida:35 -1.39942406
## Exponential:P. veronii:35-Stationary:P. putida:35 -1.10223606
## Stationary:P. veronii:35-Stationary:P. putida:35 -0.92226226
## Exponential:P. grimontii:40-Stationary:P. putida:35 -1.46846063
## Stationary:P. grimontii:40-Stationary:P. putida:35 -1.47079164
## Exponential:P. knackmussii:40-Stationary:P. putida:35 -1.06429142
## Stationary:P. knackmussii:40-Stationary:P. putida:35 -0.06570307
## Exponential:P. plecoglossicida:40-Stationary:P. putida:35 -1.78515551
## Stationary:P. plecoglossicida:40-Stationary:P. putida:35 -1.47058819
## Exponential:P. protegens:40-Stationary:P. putida:35 -1.27943269
## Stationary:P. protegens:40-Stationary:P. putida:35 -1.27943269
## Exponential:P. putida:40-Stationary:P. putida:35 -0.31927715
## Stationary:P. putida:40-Stationary:P. putida:35 -0.43452987
## Exponential:P. veronii:40-Stationary:P. putida:35 -1.30610881
## Stationary:P. veronii:40-Stationary:P. putida:35 -1.30610881
## Stationary:P. veronii:35-Exponential:P. veronii:35 -0.19153915
## Exponential:P. grimontii:40-Exponential:P. veronii:35 -0.72694040
## Stationary:P. grimontii:40-Exponential:P. veronii:35 -0.72927140
## Exponential:P. knackmussii:40-Exponential:P. veronii:35 -0.32957924
## Stationary:P. knackmussii:40-Exponential:P. veronii:35 0.66900911
## Exponential:P. plecoglossicida:40-Exponential:P. veronii:35 -1.03460096
## Stationary:P. plecoglossicida:40-Exponential:P. veronii:35 -0.72906795
## Exponential:P. protegens:40-Exponential:P. veronii:35 -0.55139129
## Stationary:P. protegens:40-Exponential:P. veronii:35 -0.55139129
## Exponential:P. putida:40-Exponential:P. veronii:35 0.40682182
## Stationary:P. putida:40-Exponential:P. veronii:35 0.29215482
## Exponential:P. veronii:40-Exponential:P. veronii:35 -0.57538570
## Stationary:P. veronii:40-Exponential:P. veronii:35 -0.57538570
## Exponential:P. grimontii:40-Stationary:P. veronii:35 -0.90691420
## Stationary:P. grimontii:40-Stationary:P. veronii:35 -0.90924520
## Exponential:P. knackmussii:40-Stationary:P. veronii:35 -0.50955304
## Stationary:P. knackmussii:40-Stationary:P. veronii:35 0.48903531
## Exponential:P. plecoglossicida:40-Stationary:P. veronii:35 -1.21457476
## Stationary:P. plecoglossicida:40-Stationary:P. veronii:35 -0.90904175
## Exponential:P. protegens:40-Stationary:P. veronii:35 -0.73136509
## Stationary:P. protegens:40-Stationary:P. veronii:35 -0.73136509
## Exponential:P. putida:40-Stationary:P. veronii:35 0.22684802
## Stationary:P. putida:40-Stationary:P. veronii:35 0.11218102
## Exponential:P. veronii:40-Stationary:P. veronii:35 -0.75535950
## Stationary:P. veronii:40-Stationary:P. veronii:35 -0.75535950
## Stationary:P. grimontii:40-Exponential:P. grimontii:40 -0.64581031
## Exponential:P. knackmussii:40-Exponential:P. grimontii:40 -0.26994282
## Stationary:P. knackmussii:40-Exponential:P. grimontii:40 0.72864554
## Exponential:P. plecoglossicida:40-Exponential:P. grimontii:40 -0.91234817
## Stationary:P. plecoglossicida:40-Exponential:P. grimontii:40 -0.64560686
## Exponential:P. protegens:40-Exponential:P. grimontii:40 -0.51104606
## Stationary:P. protegens:40-Exponential:P. grimontii:40 -0.51104606
## Exponential:P. putida:40-Exponential:P. grimontii:40 0.44221793
## Stationary:P. putida:40-Exponential:P. grimontii:40 0.32901373
## Exponential:P. veronii:40-Exponential:P. grimontii:40 -0.52772966
## Stationary:P. veronii:40-Exponential:P. grimontii:40 -0.52772966
## Exponential:P. knackmussii:40-Stationary:P. grimontii:40 -0.26761181
## Stationary:P. knackmussii:40-Stationary:P. grimontii:40 0.73097654
## Exponential:P. plecoglossicida:40-Stationary:P. grimontii:40 -0.91001716
## Stationary:P. plecoglossicida:40-Stationary:P. grimontii:40 -0.64327586
## Exponential:P. protegens:40-Stationary:P. grimontii:40 -0.50871506
## Stationary:P. protegens:40-Stationary:P. grimontii:40 -0.50871506
## Exponential:P. putida:40-Stationary:P. grimontii:40 0.44454893
## Stationary:P. putida:40-Stationary:P. grimontii:40 0.33134473
## Exponential:P. veronii:40-Stationary:P. grimontii:40 -0.52539865
## Stationary:P. veronii:40-Stationary:P. grimontii:40 -0.52539865
## Stationary:P. knackmussii:40-Exponential:P. knackmussii:40 0.54357977
## Exponential:P. plecoglossicida:40-Exponential:P. knackmussii:40 -1.14090072
## Stationary:P. plecoglossicida:40-Exponential:P. knackmussii:40 -0.84672359
## Exponential:P. protegens:40-Exponential:P. knackmussii:40 -0.68370660
## Stationary:P. protegens:40-Exponential:P. knackmussii:40 -0.68370660
## Exponential:P. putida:40-Exponential:P. knackmussii:40 0.27264075
## Stationary:P. putida:40-Exponential:P. knackmussii:40 0.15852972
## Exponential:P. veronii:40-Exponential:P. knackmussii:40 -0.70502172
## Stationary:P. veronii:40-Exponential:P. knackmussii:40 -0.70502172
## Exponential:P. plecoglossicida:40-Stationary:P. knackmussii:40 -2.13948908
## Stationary:P. plecoglossicida:40-Stationary:P. knackmussii:40 -1.84531194
## Exponential:P. protegens:40-Stationary:P. knackmussii:40 -1.68229496
## Stationary:P. protegens:40-Stationary:P. knackmussii:40 -1.68229496
## Exponential:P. putida:40-Stationary:P. knackmussii:40 -0.72594760
## Stationary:P. putida:40-Stationary:P. knackmussii:40 -0.84005863
## Exponential:P. veronii:40-Stationary:P. knackmussii:40 -1.70361007
## Stationary:P. veronii:40-Stationary:P. knackmussii:40 -1.70361007
## Stationary:P. plecoglossicida:40-Exponential:P. plecoglossicida:40 -0.90981371
## Exponential:P. protegens:40-Exponential:P. plecoglossicida:40 -0.82027839
## Stationary:P. protegens:40-Exponential:P. plecoglossicida:40 -0.82027839
## Exponential:P. putida:40-Exponential:P. plecoglossicida:40 0.12904176
## Stationary:P. putida:40-Exponential:P. plecoglossicida:40 0.01698086
## Exponential:P. veronii:40-Exponential:P. plecoglossicida:40 -0.83072821
## Stationary:P. veronii:40-Exponential:P. plecoglossicida:40 -0.83072821
## Exponential:P. protegens:40-Stationary:P. plecoglossicida:40 -0.50891851
## Stationary:P. protegens:40-Stationary:P. plecoglossicida:40 -0.50891851
## Exponential:P. putida:40-Stationary:P. plecoglossicida:40 0.44434548
## Stationary:P. putida:40-Stationary:P. plecoglossicida:40 0.33114128
## Exponential:P. veronii:40-Stationary:P. plecoglossicida:40 -0.52560211
## Stationary:P. veronii:40-Stationary:P. plecoglossicida:40 -0.52560211
## Stationary:P. protegens:40-Exponential:P. protegens:40 -0.32173965
## Exponential:P. putida:40-Exponential:P. protegens:40 0.63775682
## Stationary:P. putida:40-Exponential:P. protegens:40 0.52270368
## Exponential:P. veronii:40-Exponential:P. protegens:40 -0.34751855
## Stationary:P. veronii:40-Exponential:P. protegens:40 -0.34751855
## Exponential:P. putida:40-Stationary:P. protegens:40 0.63775682
## Stationary:P. putida:40-Stationary:P. protegens:40 0.52270368
## Exponential:P. veronii:40-Stationary:P. protegens:40 -0.34751855
## Stationary:P. veronii:40-Stationary:P. protegens:40 -0.34751855
## Stationary:P. putida:40-Exponential:P. putida:40 -0.40311250
## Exponential:P. veronii:40-Exponential:P. putida:40 -1.27527715
## Stationary:P. veronii:40-Exponential:P. putida:40 -1.27527715
## Exponential:P. veronii:40-Stationary:P. putida:40 -1.16945198
## Stationary:P. veronii:40-Stationary:P. putida:40 -1.16945198
## Stationary:P. veronii:40-Exponential:P. veronii:40 -0.37151295
## upr
## Stationary:P. grimontii:35-Exponential:P. grimontii:35 1.15582651
## Exponential:P. knackmussii:35-Exponential:P. grimontii:35 0.87098985
## Stationary:P. knackmussii:35-Exponential:P. grimontii:35 1.30198736
## Exponential:P. plecoglossicida:35-Exponential:P. grimontii:35 1.21247248
## Stationary:P. plecoglossicida:35-Exponential:P. grimontii:35 1.10930630
## Exponential:P. protegens:35-Exponential:P. grimontii:35 0.99003599
## Stationary:P. protegens:35-Exponential:P. grimontii:35 1.06521251
## Exponential:P. putida:35-Exponential:P. grimontii:35 1.13769231
## Stationary:P. putida:35-Exponential:P. grimontii:35 1.04291425
## Exponential:P. veronii:35-Exponential:P. grimontii:35 0.30139402
## Stationary:P. veronii:35-Exponential:P. grimontii:35 0.48136782
## Exponential:P. grimontii:40-Exponential:P. grimontii:35 0.21793292
## Stationary:P. grimontii:40-Exponential:P. grimontii:35 0.21560192
## Exponential:P. knackmussii:40-Exponential:P. grimontii:35 0.41904965
## Stationary:P. knackmussii:40-Exponential:P. grimontii:35 1.41763801
## Exponential:P. plecoglossicida:40-Exponential:P. grimontii:35 0.48213978
## Stationary:P. plecoglossicida:40-Exponential:P. grimontii:35 0.21580537
## Exponential:P. protegens:40-Exponential:P. grimontii:35 0.08083767
## Stationary:P. protegens:40-Exponential:P. grimontii:35 0.08083767
## Exponential:P. putida:40-Exponential:P. grimontii:35 1.01354540
## Stationary:P. putida:40-Exponential:P. grimontii:35 0.90625742
## Exponential:P. veronii:40-Exponential:P. grimontii:35 0.09752127
## Stationary:P. veronii:40-Exponential:P. grimontii:35 0.09752127
## Exponential:P. knackmussii:35-Stationary:P. grimontii:35 0.35864265
## Stationary:P. knackmussii:35-Stationary:P. grimontii:35 0.78964016
## Exponential:P. plecoglossicida:35-Stationary:P. grimontii:35 0.70012528
## Stationary:P. plecoglossicida:35-Stationary:P. grimontii:35 0.59695910
## Exponential:P. protegens:35-Stationary:P. grimontii:35 0.47768879
## Stationary:P. protegens:35-Stationary:P. grimontii:35 0.55286531
## Exponential:P. putida:35-Stationary:P. grimontii:35 0.62534511
## Stationary:P. putida:35-Stationary:P. grimontii:35 0.53056705
## Exponential:P. veronii:35-Stationary:P. grimontii:35 -0.21095318
## Stationary:P. veronii:35-Stationary:P. grimontii:35 -0.03097938
## Exponential:P. grimontii:40-Stationary:P. grimontii:35 -0.29441428
## Stationary:P. grimontii:40-Stationary:P. grimontii:35 -0.29674528
## Exponential:P. knackmussii:40-Stationary:P. grimontii:35 -0.09329755
## Stationary:P. knackmussii:40-Stationary:P. grimontii:35 0.90529081
## Exponential:P. plecoglossicida:40-Stationary:P. grimontii:35 -0.03020742
## Stationary:P. plecoglossicida:40-Stationary:P. grimontii:35 -0.29654183
## Exponential:P. protegens:40-Stationary:P. grimontii:35 -0.43150953
## Stationary:P. protegens:40-Stationary:P. grimontii:35 -0.43150953
## Exponential:P. putida:40-Stationary:P. grimontii:35 0.50119820
## Stationary:P. putida:40-Stationary:P. grimontii:35 0.39391022
## Exponential:P. veronii:40-Stationary:P. grimontii:35 -0.41482593
## Stationary:P. veronii:40-Stationary:P. grimontii:35 -0.41482593
## Stationary:P. knackmussii:35-Exponential:P. knackmussii:35 0.88600610
## Exponential:P. plecoglossicida:35-Exponential:P. knackmussii:35 0.81254218
## Stationary:P. plecoglossicida:35-Exponential:P. knackmussii:35 0.70937600
## Exponential:P. protegens:35-Exponential:P. knackmussii:35 0.56164951
## Stationary:P. protegens:35-Exponential:P. knackmussii:35 0.63682602
## Exponential:P. putida:35-Exponential:P. knackmussii:35 0.70622246
## Stationary:P. putida:35-Exponential:P. knackmussii:35 0.61235123
## Exponential:P. veronii:35-Exponential:P. knackmussii:35 -0.12236095
## Stationary:P. veronii:35-Exponential:P. knackmussii:35 0.05761285
## Exponential:P. grimontii:40-Exponential:P. knackmussii:35 -0.18199738
## Stationary:P. grimontii:40-Exponential:P. knackmussii:35 -0.18432838
## Exponential:P. knackmussii:40-Exponential:P. knackmussii:35 0.00306839
## Stationary:P. knackmussii:40-Exponential:P. knackmussii:35 1.00165674
## Exponential:P. plecoglossicida:40-Exponential:P. knackmussii:35 0.10964531
## Stationary:P. plecoglossicida:40-Exponential:P. knackmussii:35 -0.18412493
## Exponential:P. protegens:40-Exponential:P. knackmussii:35 -0.34754881
## Stationary:P. protegens:40-Exponential:P. knackmussii:35 -0.34754881
## Exponential:P. putida:40-Exponential:P. knackmussii:35 0.58207555
## Stationary:P. putida:40-Exponential:P. knackmussii:35 0.47569441
## Exponential:P. veronii:40-Exponential:P. knackmussii:35 -0.32623370
## Stationary:P. veronii:40-Exponential:P. knackmussii:35 -0.32623370
## Exponential:P. plecoglossicida:35-Stationary:P. knackmussii:35 0.38154467
## Stationary:P. plecoglossicida:35-Stationary:P. knackmussii:35 0.27837849
## Exponential:P. protegens:35-Stationary:P. knackmussii:35 0.13065199
## Stationary:P. protegens:35-Stationary:P. knackmussii:35 0.20582851
## Exponential:P. putida:35-Stationary:P. knackmussii:35 0.27522494
## Stationary:P. putida:35-Stationary:P. knackmussii:35 0.18135372
## Exponential:P. veronii:35-Stationary:P. knackmussii:35 -0.55335846
## Stationary:P. veronii:35-Stationary:P. knackmussii:35 -0.37338466
## Exponential:P. grimontii:40-Stationary:P. knackmussii:35 -0.61299489
## Stationary:P. grimontii:40-Stationary:P. knackmussii:35 -0.61532589
## Exponential:P. knackmussii:40-Stationary:P. knackmussii:35 -0.42792912
## Stationary:P. knackmussii:40-Stationary:P. knackmussii:35 0.57065923
## Exponential:P. plecoglossicida:40-Stationary:P. knackmussii:35 -0.32135221
## Stationary:P. plecoglossicida:40-Stationary:P. knackmussii:35 -0.61512244
## Exponential:P. protegens:40-Stationary:P. knackmussii:35 -0.77854633
## Stationary:P. protegens:40-Stationary:P. knackmussii:35 -0.77854633
## Exponential:P. putida:40-Stationary:P. knackmussii:35 0.15107803
## Stationary:P. putida:40-Stationary:P. knackmussii:35 0.04469689
## Exponential:P. veronii:40-Stationary:P. knackmussii:35 -0.75723121
## Stationary:P. veronii:40-Stationary:P. knackmussii:35 -0.75723121
## Stationary:P. plecoglossicida:35-Exponential:P. plecoglossicida:35 0.54031313
## Exponential:P. protegens:35-Exponential:P. plecoglossicida:35 0.42104282
## Stationary:P. protegens:35-Exponential:P. plecoglossicida:35 0.49621934
## Exponential:P. putida:35-Exponential:P. plecoglossicida:35 0.56869914
## Stationary:P. putida:35-Exponential:P. plecoglossicida:35 0.47392108
## Exponential:P. veronii:35-Exponential:P. plecoglossicida:35 -0.26759916
## Stationary:P. veronii:35-Exponential:P. plecoglossicida:35 -0.08762536
## Exponential:P. grimontii:40-Exponential:P. plecoglossicida:35 -0.35106025
## Stationary:P. grimontii:40-Exponential:P. plecoglossicida:35 -0.35339125
## Exponential:P. knackmussii:40-Exponential:P. plecoglossicida:35 -0.14994352
## Stationary:P. knackmussii:40-Exponential:P. plecoglossicida:35 0.84864483
## Exponential:P. plecoglossicida:40-Exponential:P. plecoglossicida:35 -0.08685340
## Stationary:P. plecoglossicida:40-Exponential:P. plecoglossicida:35 -0.35318780
## Exponential:P. protegens:40-Exponential:P. plecoglossicida:35 -0.48815550
## Stationary:P. protegens:40-Exponential:P. plecoglossicida:35 -0.48815550
## Exponential:P. putida:40-Exponential:P. plecoglossicida:35 0.44455223
## Stationary:P. putida:40-Exponential:P. plecoglossicida:35 0.33726425
## Exponential:P. veronii:40-Exponential:P. plecoglossicida:35 -0.47147191
## Stationary:P. veronii:40-Exponential:P. plecoglossicida:35 -0.47147191
## Exponential:P. protegens:35-Stationary:P. plecoglossicida:35 0.52420900
## Stationary:P. protegens:35-Stationary:P. plecoglossicida:35 0.59938552
## Exponential:P. putida:35-Stationary:P. plecoglossicida:35 0.67186532
## Stationary:P. putida:35-Stationary:P. plecoglossicida:35 0.57708726
## Exponential:P. veronii:35-Stationary:P. plecoglossicida:35 -0.16443298
## Stationary:P. veronii:35-Stationary:P. plecoglossicida:35 0.01554083
## Exponential:P. grimontii:40-Stationary:P. plecoglossicida:35 -0.24789407
## Stationary:P. grimontii:40-Stationary:P. plecoglossicida:35 -0.25022507
## Exponential:P. knackmussii:40-Stationary:P. plecoglossicida:35 -0.04677734
## Stationary:P. knackmussii:40-Stationary:P. plecoglossicida:35 0.95181101
## Exponential:P. plecoglossicida:40-Stationary:P. plecoglossicida:35 0.01631278
## Stationary:P. plecoglossicida:40-Stationary:P. plecoglossicida:35 -0.25002162
## Exponential:P. protegens:40-Stationary:P. plecoglossicida:35 -0.38498932
## Stationary:P. protegens:40-Stationary:P. plecoglossicida:35 -0.38498932
## Exponential:P. putida:40-Stationary:P. plecoglossicida:35 0.54771841
## Stationary:P. putida:40-Stationary:P. plecoglossicida:35 0.44043043
## Exponential:P. veronii:40-Stationary:P. plecoglossicida:35 -0.36830572
## Stationary:P. veronii:40-Stationary:P. plecoglossicida:35 -0.36830572
## Stationary:P. protegens:35-Exponential:P. protegens:35 0.39691617
## Exponential:P. putida:35-Exponential:P. protegens:35 0.46316349
## Stationary:P. putida:35-Exponential:P. protegens:35 0.37023437
## Exponential:P. veronii:35-Exponential:P. protegens:35 -0.35780703
## Stationary:P. veronii:35-Exponential:P. protegens:35 -0.17783323
## Exponential:P. grimontii:40-Exponential:P. protegens:35 -0.39815226
## Stationary:P. grimontii:40-Exponential:P. protegens:35 -0.40048326
## Exponential:P. knackmussii:40-Exponential:P. protegens:35 -0.22549172
## Stationary:P. knackmussii:40-Exponential:P. protegens:35 0.77309664
## Exponential:P. plecoglossicida:40-Exponential:P. protegens:35 -0.08891993
## Stationary:P. plecoglossicida:40-Exponential:P. protegens:35 -0.40027981
## Exponential:P. protegens:40-Exponential:P. protegens:35 -0.58745867
## Stationary:P. protegens:40-Exponential:P. protegens:35 -0.58745867
## Exponential:P. putida:40-Exponential:P. protegens:35 0.33901658
## Stationary:P. putida:40-Exponential:P. protegens:35 0.23357754
## Exponential:P. veronii:40-Exponential:P. protegens:35 -0.56167977
## Stationary:P. veronii:40-Exponential:P. protegens:35 -0.56167977
## Exponential:P. putida:35-Stationary:P. protegens:35 0.38798697
## Stationary:P. putida:35-Stationary:P. protegens:35 0.29505785
## Exponential:P. veronii:35-Stationary:P. protegens:35 -0.43298355
## Stationary:P. veronii:35-Stationary:P. protegens:35 -0.25300974
## Exponential:P. grimontii:40-Stationary:P. protegens:35 -0.47332878
## Stationary:P. grimontii:40-Stationary:P. protegens:35 -0.47565978
## Exponential:P. knackmussii:40-Stationary:P. protegens:35 -0.30066824
## Stationary:P. knackmussii:40-Stationary:P. protegens:35 0.69792012
## Exponential:P. plecoglossicida:40-Stationary:P. protegens:35 -0.16409645
## Stationary:P. plecoglossicida:40-Stationary:P. protegens:35 -0.47545633
## Exponential:P. protegens:40-Stationary:P. protegens:35 -0.66263519
## Stationary:P. protegens:40-Stationary:P. protegens:35 -0.66263519
## Exponential:P. putida:40-Stationary:P. protegens:35 0.26384006
## Stationary:P. putida:40-Stationary:P. protegens:35 0.15840102
## Exponential:P. veronii:40-Stationary:P. protegens:35 -0.63685629
## Stationary:P. veronii:40-Stationary:P. protegens:35 -0.63685629
## Stationary:P. putida:35-Exponential:P. putida:35 0.19513024
## Exponential:P. veronii:35-Exponential:P. putida:35 -0.53096874
## Stationary:P. veronii:35-Exponential:P. putida:35 -0.35099494
## Exponential:P. grimontii:40-Exponential:P. putida:35 -0.56636484
## Stationary:P. grimontii:40-Exponential:P. putida:35 -0.56869584
## Exponential:P. knackmussii:40-Exponential:P. putida:35 -0.39678767
## Stationary:P. knackmussii:40-Exponential:P. putida:35 0.60180069
## Exponential:P. plecoglossicida:40-Exponential:P. putida:35 -0.25318868
## Stationary:P. plecoglossicida:40-Exponential:P. putida:35 -0.56849239
## Exponential:P. protegens:40-Exponential:P. putida:35 -0.76190374
## Stationary:P. protegens:40-Exponential:P. putida:35 -0.76190374
## Exponential:P. putida:40-Exponential:P. putida:35 0.16362578
## Stationary:P. putida:40-Exponential:P. putida:35 0.05847341
## Exponential:P. veronii:40-Exponential:P. putida:35 -0.73484149
## Stationary:P. veronii:40-Exponential:P. putida:35 -0.73484149
## Exponential:P. veronii:35-Stationary:P. putida:35 -0.42881164
## Stationary:P. veronii:35-Stationary:P. putida:35 -0.24883784
## Exponential:P. grimontii:40-Stationary:P. putida:35 -0.46567056
## Stationary:P. grimontii:40-Stationary:P. putida:35 -0.46800156
## Exponential:P. knackmussii:40-Stationary:P. putida:35 -0.29518655
## Stationary:P. knackmussii:40-Stationary:P. putida:35 0.70340181
## Exponential:P. plecoglossicida:40-Stationary:P. putida:35 -0.15363769
## Stationary:P. plecoglossicida:40-Stationary:P. putida:35 -0.46779811
## Exponential:P. protegens:40-Stationary:P. putida:35 -0.65936051
## Stationary:P. protegens:40-Stationary:P. putida:35 -0.65936051
## Exponential:P. putida:40-Stationary:P. putida:35 0.26645567
## Stationary:P. putida:40-Stationary:P. putida:35 0.16121621
## Exponential:P. veronii:40-Stationary:P. putida:35 -0.63268439
## Stationary:P. veronii:40-Stationary:P. putida:35 -0.63268439
## Stationary:P. veronii:35-Exponential:P. veronii:35 0.55148675
## Exponential:P. grimontii:40-Exponential:P. veronii:35 0.32385691
## Stationary:P. grimontii:40-Exponential:P. veronii:35 0.32152591
## Exponential:P. knackmussii:40-Exponential:P. veronii:35 0.50114897
## Stationary:P. knackmussii:40-Exponential:P. veronii:35 1.49973733
## Exponential:P. plecoglossicida:40-Exponential:P. veronii:35 0.62685547
## Stationary:P. plecoglossicida:40-Exponential:P. veronii:35 0.32172936
## Exponential:P. protegens:40-Exponential:P. veronii:35 0.14364580
## Stationary:P. protegens:40-Exponential:P. veronii:35 0.14364580
## Exponential:P. putida:40-Exponential:P. veronii:35 1.07140440
## Stationary:P. putida:40-Exponential:P. veronii:35 0.96557923
## Exponential:P. veronii:40-Exponential:P. veronii:35 0.16764020
## Stationary:P. veronii:40-Exponential:P. veronii:35 0.16764020
## Exponential:P. grimontii:40-Stationary:P. veronii:35 0.14388311
## Stationary:P. grimontii:40-Stationary:P. veronii:35 0.14155211
## Exponential:P. knackmussii:40-Stationary:P. veronii:35 0.32117517
## Stationary:P. knackmussii:40-Stationary:P. veronii:35 1.31976352
## Exponential:P. plecoglossicida:40-Stationary:P. veronii:35 0.44688166
## Stationary:P. plecoglossicida:40-Stationary:P. veronii:35 0.14175556
## Exponential:P. protegens:40-Stationary:P. veronii:35 -0.03632800
## Stationary:P. protegens:40-Stationary:P. veronii:35 -0.03632800
## Exponential:P. putida:40-Stationary:P. veronii:35 0.89143060
## Stationary:P. putida:40-Stationary:P. veronii:35 0.78560543
## Exponential:P. veronii:40-Stationary:P. veronii:35 -0.01233360
## Stationary:P. veronii:40-Stationary:P. veronii:35 -0.01233360
## Stationary:P. grimontii:40-Exponential:P. grimontii:40 0.64114831
## Exponential:P. knackmussii:40-Exponential:P. grimontii:40 0.84459604
## Stationary:P. knackmussii:40-Exponential:P. grimontii:40 1.84318439
## Exponential:P. plecoglossicida:40-Exponential:P. grimontii:40 0.90768616
## Stationary:P. plecoglossicida:40-Exponential:P. grimontii:40 0.64135176
## Exponential:P. protegens:40-Exponential:P. grimontii:40 0.50638406
## Stationary:P. protegens:40-Exponential:P. grimontii:40 0.50638406
## Exponential:P. putida:40-Exponential:P. grimontii:40 1.43909179
## Stationary:P. putida:40-Exponential:P. grimontii:40 1.33180381
## Exponential:P. veronii:40-Exponential:P. grimontii:40 0.52306765
## Stationary:P. veronii:40-Exponential:P. grimontii:40 0.52306765
## Exponential:P. knackmussii:40-Stationary:P. grimontii:40 0.84692704
## Stationary:P. knackmussii:40-Stationary:P. grimontii:40 1.84551539
## Exponential:P. plecoglossicida:40-Stationary:P. grimontii:40 0.91001716
## Stationary:P. plecoglossicida:40-Stationary:P. grimontii:40 0.64368276
## Exponential:P. protegens:40-Stationary:P. grimontii:40 0.50871506
## Stationary:P. protegens:40-Stationary:P. grimontii:40 0.50871506
## Exponential:P. putida:40-Stationary:P. grimontii:40 1.44142279
## Stationary:P. putida:40-Stationary:P. grimontii:40 1.33413481
## Exponential:P. veronii:40-Stationary:P. grimontii:40 0.52539865
## Stationary:P. veronii:40-Stationary:P. grimontii:40 0.52539865
## Stationary:P. knackmussii:40-Exponential:P. knackmussii:40 1.45359694
## Exponential:P. plecoglossicida:40-Exponential:P. knackmussii:40 0.56158550
## Stationary:P. plecoglossicida:40-Exponential:P. knackmussii:40 0.26781527
## Exponential:P. protegens:40-Exponential:P. knackmussii:40 0.10439138
## Stationary:P. protegens:40-Exponential:P. knackmussii:40 0.10439138
## Exponential:P. putida:40-Exponential:P. knackmussii:40 1.03401574
## Stationary:P. putida:40-Exponential:P. knackmussii:40 0.92763460
## Exponential:P. veronii:40-Exponential:P. knackmussii:40 0.12570649
## Stationary:P. veronii:40-Exponential:P. knackmussii:40 0.12570649
## Exponential:P. plecoglossicida:40-Stationary:P. knackmussii:40 -0.43700286
## Stationary:P. plecoglossicida:40-Stationary:P. knackmussii:40 -0.73077309
## Exponential:P. protegens:40-Stationary:P. knackmussii:40 -0.89419698
## Stationary:P. protegens:40-Stationary:P. knackmussii:40 -0.89419698
## Exponential:P. putida:40-Stationary:P. knackmussii:40 0.03542739
## Stationary:P. putida:40-Stationary:P. knackmussii:40 -0.07095376
## Exponential:P. veronii:40-Stationary:P. knackmussii:40 -0.87288186
## Stationary:P. veronii:40-Stationary:P. knackmussii:40 -0.87288186
## Stationary:P. plecoglossicida:40-Exponential:P. plecoglossicida:40 0.91022062
## Exponential:P. protegens:40-Exponential:P. plecoglossicida:40 0.82027839
## Stationary:P. protegens:40-Exponential:P. plecoglossicida:40 0.82027839
## Exponential:P. putida:40-Exponential:P. plecoglossicida:40 1.75692996
## Stationary:P. putida:40-Exponential:P. plecoglossicida:40 1.64849868
## Exponential:P. veronii:40-Exponential:P. plecoglossicida:40 0.83072821
## Stationary:P. veronii:40-Exponential:P. plecoglossicida:40 0.83072821
## Exponential:P. protegens:40-Stationary:P. plecoglossicida:40 0.50851161
## Stationary:P. protegens:40-Stationary:P. plecoglossicida:40 0.50851161
## Exponential:P. putida:40-Stationary:P. plecoglossicida:40 1.44121934
## Stationary:P. putida:40-Stationary:P. plecoglossicida:40 1.33393136
## Exponential:P. veronii:40-Stationary:P. plecoglossicida:40 0.52519520
## Stationary:P. veronii:40-Stationary:P. plecoglossicida:40 0.52519520
## Stationary:P. protegens:40-Exponential:P. protegens:40 0.32173965
## Exponential:P. putida:40-Exponential:P. protegens:40 1.24821490
## Stationary:P. putida:40-Exponential:P. protegens:40 1.14277586
## Exponential:P. veronii:40-Exponential:P. protegens:40 0.34751855
## Stationary:P. veronii:40-Exponential:P. protegens:40 0.34751855
## Exponential:P. putida:40-Stationary:P. protegens:40 1.24821490
## Stationary:P. putida:40-Stationary:P. protegens:40 1.14277586
## Exponential:P. veronii:40-Stationary:P. protegens:40 0.34751855
## Stationary:P. veronii:40-Stationary:P. protegens:40 0.34751855
## Stationary:P. putida:40-Exponential:P. putida:40 0.18262033
## Exponential:P. veronii:40-Exponential:P. putida:40 -0.61069457
## Stationary:P. veronii:40-Exponential:P. putida:40 -0.61069457
## Exponential:P. veronii:40-Stationary:P. putida:40 -0.49602757
## Stationary:P. veronii:40-Stationary:P. putida:40 -0.49602757
## Stationary:P. veronii:40-Exponential:P. veronii:40 0.37151295
## p adj
## Stationary:P. grimontii:35-Exponential:P. grimontii:35 0.3418176
## Exponential:P. knackmussii:35-Exponential:P. grimontii:35 0.9147698
## Stationary:P. knackmussii:35-Exponential:P. grimontii:35 0.0004609
## Exponential:P. plecoglossicida:35-Exponential:P. grimontii:35 0.1659927
## Stationary:P. plecoglossicida:35-Exponential:P. grimontii:35 0.5372946
## Exponential:P. protegens:35-Exponential:P. grimontii:35 0.0902541
## Stationary:P. protegens:35-Exponential:P. grimontii:35 0.0158384
## Exponential:P. putida:35-Exponential:P. grimontii:35 0.0010751
## Stationary:P. putida:35-Exponential:P. grimontii:35 0.0189433
## Exponential:P. veronii:35-Exponential:P. grimontii:35 0.9964249
## Stationary:P. veronii:35-Exponential:P. grimontii:35 1.0000000
## Exponential:P. grimontii:40-Exponential:P. grimontii:35 0.7126319
## Stationary:P. grimontii:40-Exponential:P. grimontii:35 0.7030188
## Exponential:P. knackmussii:40-Exponential:P. grimontii:35 0.9999996
## Stationary:P. knackmussii:40-Exponential:P. grimontii:35 0.0000135
## Exponential:P. plecoglossicida:40-Exponential:P. grimontii:35 0.9873731
## Stationary:P. plecoglossicida:40-Exponential:P. grimontii:35 0.7038620
## Exponential:P. protegens:40-Exponential:P. grimontii:35 0.2418628
## Stationary:P. protegens:40-Exponential:P. grimontii:35 0.2418628
## Exponential:P. putida:40-Exponential:P. grimontii:35 0.0337571
## Stationary:P. putida:40-Exponential:P. grimontii:35 0.3148341
## Exponential:P. veronii:40-Exponential:P. grimontii:35 0.2988726
## Stationary:P. veronii:40-Exponential:P. grimontii:35 0.2988726
## Exponential:P. knackmussii:35-Stationary:P. grimontii:35 0.9997506
## Stationary:P. knackmussii:35-Stationary:P. grimontii:35 0.9973691
## Exponential:P. plecoglossicida:35-Stationary:P. grimontii:35 1.0000000
## Stationary:P. plecoglossicida:35-Stationary:P. grimontii:35 1.0000000
## Exponential:P. protegens:35-Stationary:P. grimontii:35 1.0000000
## Stationary:P. protegens:35-Stationary:P. grimontii:35 1.0000000
## Exponential:P. putida:35-Stationary:P. grimontii:35 0.9999994
## Stationary:P. putida:35-Stationary:P. grimontii:35 1.0000000
## Exponential:P. veronii:35-Stationary:P. grimontii:35 0.0001589
## Stationary:P. veronii:35-Stationary:P. grimontii:35 0.0247042
## Exponential:P. grimontii:40-Stationary:P. grimontii:35 0.0000615
## Stationary:P. grimontii:40-Stationary:P. grimontii:35 0.0000578
## Exponential:P. knackmussii:40-Stationary:P. grimontii:35 0.0058681
## Stationary:P. knackmussii:40-Stationary:P. grimontii:35 0.8030307
## Exponential:P. plecoglossicida:40-Stationary:P. grimontii:35 0.0338600
## Stationary:P. plecoglossicida:40-Stationary:P. grimontii:35 0.0000581
## Exponential:P. protegens:40-Stationary:P. grimontii:35 0.0000000
## Stationary:P. protegens:40-Stationary:P. grimontii:35 0.0000000
## Exponential:P. putida:40-Stationary:P. grimontii:35 1.0000000
## Stationary:P. putida:40-Stationary:P. grimontii:35 1.0000000
## Exponential:P. veronii:40-Stationary:P. grimontii:35 0.0000001
## Stationary:P. veronii:40-Stationary:P. grimontii:35 0.0000001
## Stationary:P. knackmussii:35-Exponential:P. knackmussii:35 0.0892398
## Exponential:P. plecoglossicida:35-Exponential:P. knackmussii:35 0.9908478
## Stationary:P. plecoglossicida:35-Exponential:P. knackmussii:35 0.9999976
## Exponential:P. protegens:35-Exponential:P. knackmussii:35 0.9965402
## Stationary:P. protegens:35-Exponential:P. knackmussii:35 0.8214441
## Exponential:P. putida:35-Exponential:P. knackmussii:35 0.2149828
## Stationary:P. putida:35-Exponential:P. knackmussii:35 0.8682128
## Exponential:P. veronii:35-Exponential:P. knackmussii:35 0.0008917
## Stationary:P. veronii:35-Exponential:P. knackmussii:35 0.2038365
## Exponential:P. grimontii:40-Exponential:P. knackmussii:35 0.0005388
## Stationary:P. grimontii:40-Exponential:P. knackmussii:35 0.0005041
## Exponential:P. knackmussii:40-Exponential:P. knackmussii:35 0.0539943
## Stationary:P. knackmussii:40-Exponential:P. knackmussii:35 0.0036166
## Exponential:P. plecoglossicida:40-Exponential:P. knackmussii:35 0.1868218
## Stationary:P. plecoglossicida:40-Exponential:P. knackmussii:35 0.0005070
## Exponential:P. protegens:40-Exponential:P. knackmussii:35 0.0000000
## Stationary:P. protegens:40-Exponential:P. knackmussii:35 0.0000000
## Exponential:P. putida:40-Exponential:P. knackmussii:35 0.9530299
## Stationary:P. putida:40-Exponential:P. knackmussii:35 0.9999998
## Exponential:P. veronii:40-Exponential:P. knackmussii:35 0.0000001
## Stationary:P. veronii:40-Exponential:P. knackmussii:35 0.0000001
## Exponential:P. plecoglossicida:35-Stationary:P. knackmussii:35 0.9999677
## Stationary:P. plecoglossicida:35-Stationary:P. knackmussii:35 0.9739367
## Exponential:P. protegens:35-Stationary:P. knackmussii:35 0.6936504
## Stationary:P. protegens:35-Stationary:P. knackmussii:35 0.9847436
## Exponential:P. putida:35-Stationary:P. knackmussii:35 0.9999968
## Stationary:P. putida:35-Stationary:P. knackmussii:35 0.9535748
## Exponential:P. veronii:35-Stationary:P. knackmussii:35 0.0000000
## Stationary:P. veronii:35-Stationary:P. knackmussii:35 0.0000000
## Exponential:P. grimontii:40-Stationary:P. knackmussii:35 0.0000000
## Stationary:P. grimontii:40-Stationary:P. knackmussii:35 0.0000000
## Exponential:P. knackmussii:40-Stationary:P. knackmussii:35 0.0000000
## Stationary:P. knackmussii:40-Stationary:P. knackmussii:35 0.9999994
## Exponential:P. plecoglossicida:40-Stationary:P. knackmussii:35 0.0002364
## Stationary:P. plecoglossicida:40-Stationary:P. knackmussii:35 0.0000000
## Exponential:P. protegens:40-Stationary:P. knackmussii:35 0.0000000
## Stationary:P. protegens:40-Stationary:P. knackmussii:35 0.0000000
## Exponential:P. putida:40-Stationary:P. knackmussii:35 0.8479801
## Stationary:P. putida:40-Stationary:P. knackmussii:35 0.1667202
## Exponential:P. veronii:40-Stationary:P. knackmussii:35 0.0000000
## Stationary:P. veronii:40-Stationary:P. knackmussii:35 0.0000000
## Stationary:P. plecoglossicida:35-Exponential:P. plecoglossicida:35 1.0000000
## Exponential:P. protegens:35-Exponential:P. plecoglossicida:35 1.0000000
## Stationary:P. protegens:35-Exponential:P. plecoglossicida:35 1.0000000
## Exponential:P. putida:35-Exponential:P. plecoglossicida:35 1.0000000
## Stationary:P. putida:35-Exponential:P. plecoglossicida:35 1.0000000
## Exponential:P. veronii:35-Exponential:P. plecoglossicida:35 0.0000250
## Stationary:P. veronii:35-Exponential:P. plecoglossicida:35 0.0059210
## Exponential:P. grimontii:40-Exponential:P. plecoglossicida:35 0.0000131
## Stationary:P. grimontii:40-Exponential:P. plecoglossicida:35 0.0000123
## Exponential:P. knackmussii:40-Exponential:P. plecoglossicida:35 0.0013217
## Stationary:P. knackmussii:40-Exponential:P. plecoglossicida:35 0.9583273
## Exponential:P. plecoglossicida:40-Exponential:P. plecoglossicida:35 0.0155300
## Stationary:P. plecoglossicida:40-Exponential:P. plecoglossicida:35 0.0000123
## Exponential:P. protegens:40-Exponential:P. plecoglossicida:35 0.0000000
## Stationary:P. protegens:40-Exponential:P. plecoglossicida:35 0.0000000
## Exponential:P. putida:40-Exponential:P. plecoglossicida:35 1.0000000
## Stationary:P. putida:40-Exponential:P. plecoglossicida:35 0.9999387
## Exponential:P. veronii:40-Exponential:P. plecoglossicida:35 0.0000000
## Stationary:P. veronii:40-Exponential:P. plecoglossicida:35 0.0000000
## Exponential:P. protegens:35-Stationary:P. plecoglossicida:35 1.0000000
## Stationary:P. protegens:35-Stationary:P. plecoglossicida:35 1.0000000
## Exponential:P. putida:35-Stationary:P. plecoglossicida:35 0.9998310
## Stationary:P. putida:35-Stationary:P. plecoglossicida:35 1.0000000
## Exponential:P. veronii:35-Stationary:P. plecoglossicida:35 0.0006686
## Stationary:P. veronii:35-Stationary:P. plecoglossicida:35 0.0696210
## Exponential:P. grimontii:40-Stationary:P. plecoglossicida:35 0.0002081
## Stationary:P. grimontii:40-Stationary:P. plecoglossicida:35 0.0001960
## Exponential:P. knackmussii:40-Stationary:P. plecoglossicida:35 0.0180174
## Stationary:P. knackmussii:40-Stationary:P. plecoglossicida:35 0.5829399
## Exponential:P. plecoglossicida:40-Stationary:P. plecoglossicida:35 0.0612236
## Stationary:P. plecoglossicida:40-Stationary:P. plecoglossicida:35 0.0001971
## Exponential:P. protegens:40-Stationary:P. plecoglossicida:35 0.0000002
## Stationary:P. protegens:40-Stationary:P. plecoglossicida:35 0.0000002
## Exponential:P. putida:40-Stationary:P. plecoglossicida:35 1.0000000
## Stationary:P. putida:40-Stationary:P. plecoglossicida:35 1.0000000
## Exponential:P. veronii:40-Stationary:P. plecoglossicida:35 0.0000007
## Stationary:P. veronii:40-Stationary:P. plecoglossicida:35 0.0000007
## Stationary:P. protegens:35-Exponential:P. protegens:35 0.9999999
## Exponential:P. putida:35-Exponential:P. protegens:35 0.9626286
## Stationary:P. putida:35-Exponential:P. protegens:35 1.0000000
## Exponential:P. veronii:35-Exponential:P. protegens:35 0.0000000
## Stationary:P. veronii:35-Exponential:P. protegens:35 0.0000239
## Exponential:P. grimontii:40-Exponential:P. protegens:35 0.0000002
## Stationary:P. grimontii:40-Exponential:P. protegens:35 0.0000001
## Exponential:P. knackmussii:40-Exponential:P. protegens:35 0.0000081
## Stationary:P. knackmussii:40-Exponential:P. protegens:35 0.0763352
## Exponential:P. plecoglossicida:40-Exponential:P. protegens:35 0.0131049
## Stationary:P. plecoglossicida:40-Exponential:P. protegens:35 0.0000001
## Exponential:P. protegens:40-Exponential:P. protegens:35 0.0000000
## Stationary:P. protegens:40-Exponential:P. protegens:35 0.0000000
## Exponential:P. putida:40-Exponential:P. protegens:35 1.0000000
## Stationary:P. putida:40-Exponential:P. protegens:35 0.9999997
## Exponential:P. veronii:40-Exponential:P. protegens:35 0.0000000
## Stationary:P. veronii:40-Exponential:P. protegens:35 0.0000000
## Exponential:P. putida:35-Stationary:P. protegens:35 0.9999979
## Stationary:P. putida:35-Stationary:P. protegens:35 1.0000000
## Exponential:P. veronii:35-Stationary:P. protegens:35 0.0000000
## Stationary:P. veronii:35-Stationary:P. protegens:35 0.0000004
## Exponential:P. grimontii:40-Stationary:P. protegens:35 0.0000000
## Stationary:P. grimontii:40-Stationary:P. protegens:35 0.0000000
## Exponential:P. knackmussii:40-Stationary:P. protegens:35 0.0000002
## Stationary:P. knackmussii:40-Stationary:P. protegens:35 0.4058996
## Exponential:P. plecoglossicida:40-Stationary:P. protegens:35 0.0036880
## Stationary:P. plecoglossicida:40-Stationary:P. protegens:35 0.0000000
## Exponential:P. protegens:40-Stationary:P. protegens:35 0.0000000
## Stationary:P. protegens:40-Stationary:P. protegens:35 0.0000000
## Exponential:P. putida:40-Stationary:P. protegens:35 1.0000000
## Stationary:P. putida:40-Stationary:P. protegens:35 0.9798920
## Exponential:P. veronii:40-Stationary:P. protegens:35 0.0000000
## Stationary:P. veronii:40-Stationary:P. protegens:35 0.0000000
## Stationary:P. putida:35-Exponential:P. putida:35 0.9999152
## Exponential:P. veronii:35-Exponential:P. putida:35 0.0000000
## Stationary:P. veronii:35-Exponential:P. putida:35 0.0000000
## Exponential:P. grimontii:40-Exponential:P. putida:35 0.0000000
## Stationary:P. grimontii:40-Exponential:P. putida:35 0.0000000
## Exponential:P. knackmussii:40-Exponential:P. putida:35 0.0000000
## Stationary:P. knackmussii:40-Exponential:P. putida:35 0.8880185
## Exponential:P. plecoglossicida:40-Exponential:P. putida:35 0.0006889
## Stationary:P. plecoglossicida:40-Exponential:P. putida:35 0.0000000
## Exponential:P. protegens:40-Exponential:P. putida:35 0.0000000
## Stationary:P. protegens:40-Exponential:P. putida:35 0.0000000
## Exponential:P. putida:40-Exponential:P. putida:35 0.9958059
## Stationary:P. putida:40-Exponential:P. putida:35 0.3317863
## Exponential:P. veronii:40-Exponential:P. putida:35 0.0000000
## Stationary:P. veronii:40-Exponential:P. putida:35 0.0000000
## Exponential:P. veronii:35-Stationary:P. putida:35 0.0000000
## Stationary:P. veronii:35-Stationary:P. putida:35 0.0000004
## Exponential:P. grimontii:40-Stationary:P. putida:35 0.0000000
## Stationary:P. grimontii:40-Stationary:P. putida:35 0.0000000
## Exponential:P. knackmussii:40-Stationary:P. putida:35 0.0000002
## Stationary:P. knackmussii:40-Stationary:P. putida:35 0.2664388
## Exponential:P. plecoglossicida:40-Stationary:P. putida:35 0.0043640
## Stationary:P. plecoglossicida:40-Stationary:P. putida:35 0.0000000
## Exponential:P. protegens:40-Stationary:P. putida:35 0.0000000
## Stationary:P. protegens:40-Stationary:P. putida:35 0.0000000
## Exponential:P. putida:40-Stationary:P. putida:35 1.0000000
## Stationary:P. putida:40-Stationary:P. putida:35 0.9906716
## Exponential:P. veronii:40-Stationary:P. putida:35 0.0000000
## Stationary:P. veronii:40-Stationary:P. putida:35 0.0000000
## Stationary:P. veronii:35-Exponential:P. veronii:35 0.9819958
## Exponential:P. grimontii:40-Exponential:P. veronii:35 0.9992179
## Stationary:P. grimontii:40-Exponential:P. veronii:35 0.9990704
## Exponential:P. knackmussii:40-Exponential:P. veronii:35 1.0000000
## Stationary:P. knackmussii:40-Exponential:P. veronii:35 0.0000000
## Exponential:P. plecoglossicida:40-Exponential:P. veronii:35 0.9999997
## Stationary:P. plecoglossicida:40-Exponential:P. veronii:35 0.9990842
## Exponential:P. protegens:40-Exponential:P. veronii:35 0.8782712
## Stationary:P. protegens:40-Exponential:P. veronii:35 0.8782712
## Exponential:P. putida:40-Exponential:P. veronii:35 0.0000000
## Stationary:P. putida:40-Exponential:P. veronii:35 0.0000000
## Exponential:P. veronii:40-Exponential:P. veronii:35 0.9327070
## Stationary:P. veronii:40-Exponential:P. veronii:35 0.9327070
## Exponential:P. grimontii:40-Stationary:P. veronii:35 0.5309277
## Stationary:P. grimontii:40-Stationary:P. veronii:35 0.5182612
## Exponential:P. knackmussii:40-Stationary:P. veronii:35 0.9999999
## Stationary:P. knackmussii:40-Stationary:P. veronii:35 0.0000000
## Exponential:P. plecoglossicida:40-Stationary:P. veronii:35 0.9898042
## Stationary:P. plecoglossicida:40-Stationary:P. veronii:35 0.5193652
## Exponential:P. protegens:40-Stationary:P. veronii:35 0.0137894
## Stationary:P. protegens:40-Stationary:P. veronii:35 0.0137894
## Exponential:P. putida:40-Stationary:P. veronii:35 0.0000010
## Stationary:P. putida:40-Stationary:P. veronii:35 0.0004852
## Exponential:P. veronii:40-Stationary:P. veronii:35 0.0338584
## Stationary:P. veronii:40-Stationary:P. veronii:35 0.0338584
## Stationary:P. grimontii:40-Exponential:P. grimontii:40 1.0000000
## Exponential:P. knackmussii:40-Exponential:P. grimontii:40 0.9640013
## Stationary:P. knackmussii:40-Exponential:P. grimontii:40 0.0000000
## Exponential:P. plecoglossicida:40-Exponential:P. grimontii:40 1.0000000
## Stationary:P. plecoglossicida:40-Exponential:P. grimontii:40 1.0000000
## Exponential:P. protegens:40-Exponential:P. grimontii:40 1.0000000
## Stationary:P. protegens:40-Exponential:P. grimontii:40 1.0000000
## Exponential:P. putida:40-Exponential:P. grimontii:40 0.0000000
## Stationary:P. putida:40-Exponential:P. grimontii:40 0.0000017
## Exponential:P. veronii:40-Exponential:P. grimontii:40 1.0000000
## Stationary:P. veronii:40-Exponential:P. grimontii:40 1.0000000
## Exponential:P. knackmussii:40-Stationary:P. grimontii:40 0.9608103
## Stationary:P. knackmussii:40-Stationary:P. grimontii:40 0.0000000
## Exponential:P. plecoglossicida:40-Stationary:P. grimontii:40 1.0000000
## Stationary:P. plecoglossicida:40-Stationary:P. grimontii:40 1.0000000
## Exponential:P. protegens:40-Stationary:P. grimontii:40 1.0000000
## Stationary:P. protegens:40-Stationary:P. grimontii:40 1.0000000
## Exponential:P. putida:40-Stationary:P. grimontii:40 0.0000000
## Stationary:P. putida:40-Stationary:P. grimontii:40 0.0000016
## Exponential:P. veronii:40-Stationary:P. grimontii:40 1.0000000
## Stationary:P. veronii:40-Stationary:P. grimontii:40 1.0000000
## Stationary:P. knackmussii:40-Exponential:P. knackmussii:40 0.0000000
## Exponential:P. plecoglossicida:40-Exponential:P. knackmussii:40 0.9998828
## Stationary:P. plecoglossicida:40-Exponential:P. knackmussii:40 0.9610969
## Exponential:P. protegens:40-Exponential:P. knackmussii:40 0.5054619
## Stationary:P. protegens:40-Exponential:P. knackmussii:40 0.5054619
## Exponential:P. putida:40-Exponential:P. knackmussii:40 0.0000005
## Stationary:P. putida:40-Exponential:P. knackmussii:40 0.0001328
## Exponential:P. veronii:40-Exponential:P. knackmussii:40 0.6132816
## Stationary:P. veronii:40-Exponential:P. knackmussii:40 0.6132816
## Exponential:P. plecoglossicida:40-Stationary:P. knackmussii:40 0.0000232
## Stationary:P. plecoglossicida:40-Stationary:P. knackmussii:40 0.0000000
## Exponential:P. protegens:40-Stationary:P. knackmussii:40 0.0000000
## Stationary:P. protegens:40-Stationary:P. knackmussii:40 0.0000000
## Exponential:P. putida:40-Stationary:P. knackmussii:40 0.1339820
## Stationary:P. putida:40-Stationary:P. knackmussii:40 0.0046090
## Exponential:P. veronii:40-Stationary:P. knackmussii:40 0.0000000
## Stationary:P. veronii:40-Stationary:P. knackmussii:40 0.0000000
## Stationary:P. plecoglossicida:40-Exponential:P. plecoglossicida:40 1.0000000
## Exponential:P. protegens:40-Exponential:P. plecoglossicida:40 1.0000000
## Stationary:P. protegens:40-Exponential:P. plecoglossicida:40 1.0000000
## Exponential:P. putida:40-Exponential:P. plecoglossicida:40 0.0066426
## Stationary:P. putida:40-Exponential:P. plecoglossicida:40 0.0392434
## Exponential:P. veronii:40-Exponential:P. plecoglossicida:40 1.0000000
## Stationary:P. veronii:40-Exponential:P. plecoglossicida:40 1.0000000
## Exponential:P. protegens:40-Stationary:P. plecoglossicida:40 1.0000000
## Stationary:P. protegens:40-Stationary:P. plecoglossicida:40 1.0000000
## Exponential:P. putida:40-Stationary:P. plecoglossicida:40 0.0000000
## Stationary:P. putida:40-Stationary:P. plecoglossicida:40 0.0000016
## Exponential:P. veronii:40-Stationary:P. plecoglossicida:40 1.0000000
## Stationary:P. veronii:40-Stationary:P. plecoglossicida:40 1.0000000
## Stationary:P. protegens:40-Exponential:P. protegens:40 1.0000000
## Exponential:P. putida:40-Exponential:P. protegens:40 0.0000000
## Stationary:P. putida:40-Exponential:P. protegens:40 0.0000000
## Exponential:P. veronii:40-Exponential:P. protegens:40 1.0000000
## Stationary:P. veronii:40-Exponential:P. protegens:40 1.0000000
## Exponential:P. putida:40-Stationary:P. protegens:40 0.0000000
## Stationary:P. putida:40-Stationary:P. protegens:40 0.0000000
## Exponential:P. veronii:40-Stationary:P. protegens:40 1.0000000
## Stationary:P. veronii:40-Stationary:P. protegens:40 1.0000000
## Stationary:P. putida:40-Exponential:P. putida:40 0.9994129
## Exponential:P. veronii:40-Exponential:P. putida:40 0.0000000
## Stationary:P. veronii:40-Exponential:P. putida:40 0.0000000
## Exponential:P. veronii:40-Stationary:P. putida:40 0.0000000
## Stationary:P. veronii:40-Stationary:P. putida:40 0.0000000
## Stationary:P. veronii:40-Exponential:P. veronii:40 1.0000000
# visualize the raw data
ggplot(CFUraw_survival,
aes(y=survival, x=Species)) +
facet_grid(Inoculum ~ Temp) +
geom_hline(yintercept = 1) +
geom_jitter(width=0.2, alpha=0.5, aes(colour=Sample)) +
# show the mean and confidence intervals using "mean_cl_boot": nonparametric bootstrap for obtaining confidence limits for the population mean without assuming normality
stat_summary(fun.data = "mean_cl_boot", color = "black", alpha=0.7, size=0.2, na.rm = TRUE)+
theme(axis.text.x=element_text(angle = 60, hjust = 0.95),
legend.position="none") +
labs(y="Effect Size (CFU of Inocula)")
ggplot(CFUraw_survival,
aes(y=survival, x=Species)) +
facet_grid(Inoculum ~ Temp) +
geom_hline(yintercept = 1) +
geom_jitter(width=0.2, alpha=0.5, aes(colour=Sample)) +
# show the mean and confidence intervals using "mean_cl_boot": nonparametric bootstrap for obtaining confidence limits for the population mean without assuming normality
stat_summary(fun.data = "mean_cl_boot", color = "black", alpha=0.7, size=0.2, na.rm = TRUE)+
theme(axis.text.x=element_text(angle = 60, hjust = 0.95)) +
labs(y="Effect Size (CFU stress/CFU 28*C)")
plot.CFU_survival <- CFUraw_survival %>% filter(Sample %in% c("BSC019", "CK101", "BSC001", "BSC004")) %>%
group_by(Sample, Species, Inoculum, Temp) %>%
dplyr::summarize(mean_survival = mean_cl_boot(survival)$y,
lwr_CI = mean_cl_boot(survival)$ymin,
upr_CI = mean_cl_boot(survival)$ymax)
## `summarise()` has grouped output by 'Sample', 'Species', 'Inoculum'. You can
## override using the `.groups` argument.
plot.CFU_survival$Shape <- ifelse(plot.CFU_survival$mean_survival==0, "\u2620", "\u25cf")
plot.CFU_survivalEXP <- plot.CFU_survival %>% filter(Inoculum == "Exponential")
ggplot(plot.CFU_survivalEXP,
aes(y=mean_survival, x=Temp, colour=factor(Species))) +
geom_hline(yintercept = 1, alpha=0.5) +
geom_point(position = position_dodge(width = 0.5), shape=plot.CFU_survivalEXP$Shape, size=4) +
geom_errorbar(aes(ymin=lwr_CI, ymax=upr_CI), position = position_dodge(width = 0.5), width=0.1) +
scale_colour_manual(values=sp_palette[c(1,4:6)]) +
scale_y_continuous(limits=c(0,1.6)) +
labs(y = paste0("Effect Size (CFU at stress/CFU at 28", "\u00B0", "C)"),
x = paste0("Stress Temperature (", "\u00B0", "C)"),
title="Exponential Culture",
colour="Species")
rm(plot.CFU_survivalEXP)
plot.CFU_survivalSTA <- plot.CFU_survival %>% filter(Inoculum == "Stationary")
ggplot(plot.CFU_survivalSTA,
aes(y=mean_survival, x=Temp, colour=factor(Species))) +
geom_hline(yintercept = 1, alpha=0.5) +
geom_point(position = position_dodge(width = 0.5), shape=plot.CFU_survivalSTA$Shape, size=4) +
geom_errorbar(aes(ymin=lwr_CI, ymax=upr_CI), position = position_dodge(width = 0.5), width=0.1) +
scale_colour_manual(values=sp_palette[c(1,4:6)]) +
scale_y_continuous(limits=c(0,1.6)) +
labs(y = paste0("Effect Size (CFU at stress/CFU at 28", "\u00B0", "C)"),
x = paste0("Stress Temperature (", "\u00B0", "C)"),
title="Stationary Culture",
colour="Species")
rm(plot.CFU_survivalSTA, plot.CFU_survival)
# clean up all the CFU data.frames that we will not need anymore
#rm(CFUraw_inocula, CFUraw_survival, survival.anova, survival.anova.ALLinteractions, model.set, model.names)
Let’s plot the mean values. Here the code for the plot from my January 2024 poster (note that it doesn’t look exactly the same because the data has changed):
# add the species data to CFU_survival.df
CFU_survival.df <- left_join(CFU_survival.df,
TTD.df %>% ungroup() %>% select(Sample, Species, Strain) %>% distinct())
CFU_3sp <- CFU_survival.df %>% filter(Species %in% c("P. putida", "P. veronii", "P. knackmussii"),
Inoculum == "Exponential")
# add jitter manually but in such a way that it will be the same for all plots
jitter.df <- TTD.df %>% select(Sample, Species, Strain, Temp, Inoculum) %>% distinct()
jitter_width = 0.5
set.seed(114)
jitter.df$jitterTemp <- jitter.df$Temp + runif(nrow(jitter.df), min=-jitter_width, max=jitter_width)
# join the jitter to the survival values
CFU_3sp <- left_join(CFU_3sp,
jitter.df %>% filter(Inoculum == "Exponential", Temp %in% c(35, 40)))
# plot the survival values from CFU's
ggplot(CFU_3sp, aes(x=jitterTemp, y=mean_surviv, colour=Species)) +
geom_hline(yintercept = 0, colour="grey") +
scale_colour_manual(values=c("#9632B8","#EEA236","#357EBD")) +
scale_y_continuous(breaks = c(0,0.5,1)) +
scale_x_continuous(limits=c(33, 42), breaks=c(35,40)) +
geom_point(alpha=0.6) +
geom_errorbar(aes(ymin=mean_surviv-sd_surviv, ymax=mean_surviv+sd_surviv),
width=0, alpha=0.6) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y="Survival")
rm(CFU_3sp)
Here it is again for the entire data-set:
# join the jitter to the survival values
CFU_plot <- left_join(CFU_survival.df,
jitter.df %>% filter(Temp %in% c(35, 40)))
# plot the survival values from CFU's
ggplot(CFU_plot %>% filter(Inoculum == "Exponential"),
aes(x=jitterTemp, y=mean_surviv, colour=Species)) +
geom_hline(yintercept = 0, colour="grey") +
scale_y_continuous(breaks = c(0,0.5,1)) +
scale_x_continuous(limits=c(33, 42), breaks=c(35,40)) +
geom_point(alpha=0.6) +
geom_errorbar(aes(ymin=mean_surviv-sd_surviv, ymax=mean_surviv+sd_surviv),
width=0, alpha=0.6) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y="Survival",
title="Effect of Species for Exponential Phase Inoculum")
ggplot(CFU_plot %>% filter(Inoculum == "Stationary"),
aes(x=jitterTemp, y=mean_surviv, colour=Species)) +
geom_hline(yintercept = 0, colour="grey") +
scale_y_continuous(breaks = c(0,0.5,1)) +
scale_x_continuous(limits=c(33, 42), breaks=c(35,40)) +
geom_point(alpha=0.6, shape=17) +
geom_errorbar(aes(ymin=mean_surviv-sd_surviv, ymax=mean_surviv+sd_surviv),
width=0, alpha=0.6) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y="Survival",
title="Effect of Species for Stationary Phase Inoculum")
ggplot(CFU_plot, aes(x=jitterTemp, y=mean_surviv, colour=Species, shape=Inoculum)) +
geom_hline(yintercept = 0, colour="grey") +
scale_y_continuous(breaks = c(0,0.5,1)) +
scale_x_continuous(limits=c(33, 42), breaks=c(35,40)) +
geom_point(alpha=0.6) +
geom_errorbar(aes(ymin=mean_surviv-sd_surviv, ymax=mean_surviv+sd_surviv),
width=0, alpha=0.6) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y="Survival",
title="Effect of Species & Inoculum")
ggplot(CFU_plot, aes(x=jitterTemp, y=mean_surviv, colour=Inoculum)) +
geom_hline(yintercept = 0, colour="grey") +
scale_y_continuous(breaks = c(0,0.5,1)) +
scale_x_continuous(limits=c(33, 42), breaks=c(35,40)) +
geom_point(alpha=0.6) +
geom_errorbar(aes(ymin=mean_surviv-sd_surviv, ymax=mean_surviv+sd_surviv),
width=0, alpha=0.6) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y="Survival")
Growth on solid (CFU’s) is not the same as growth in liquid, even if the medium itself has the same nutrients. Let’s see how the survival data from the growth curves compares to survival data from the CFU’s.
Use the data from both the higher and the lower TTD cutoffs as a binary indicator of growth (i.e., if we failed to find you at both cutoffs, then we assume that you didn’t grow at all). AKA survival at different temperatures.
binary_survival <- TTD.df
# convert the data TTD data into binary survival for both thresholds
binary_survival$TTD_0.05 <- !is.na(binary_survival$TTD_0.05)
binary_survival$TTD_0.13 <- !is.na(binary_survival$TTD_0.13)
# let's condense the TTD binary data by assuming that if you returned TRUE in either of the thresholds, then you grew.
binary_survival$TTD <- binary_survival$TTD_0.05 | binary_survival$TTD_0.13
# similarly, convert the CFU survival data into binary values
binary_survival$CFU_survival <- binary_survival$mean_surviv > 0
# summarize the binary growth data into fraction of all replicates when growth was observed
binary_survival <- binary_survival %>% select(Sample, Species, Temp, Inoculum, Dilution, TTD, CFU_survival) %>% # keep just the meta-data and the TTD binary survival
group_by(Sample, Temp, Inoculum) %>%
summarise(fraction_batch=mean(TTD),
fraction_CFU=mean(CFU_survival))
## `summarise()` has grouped output by 'Sample', 'Temp'. You can override using
## the `.groups` argument.
# change CFU_survival to a factor
binary_survival$fraction_CFU <- as.logical(binary_survival$fraction_CFU)
ggplot(binary_survival,
aes(y=fraction_CFU, x=fraction_batch)) +
geom_jitter(width=0.01, height=0.1, alpha=0.2) +
labs(y="Observed growth by CFU?",
x="Fraction of batch cultures that grew")
…Make a plot of the survival based on growth curves and the survival based on CFU…
Now that we have the CFU counts loaded in with the TTD data, it is possible to summarize the information contained from the dilution TTD values into just one estimate for the growth rate, following Mytilinaios et al. 2015.
From plate_reader_calibration.Rmd, I am using a very
rough estimate to convert the inoculum estimate from CFU into OD. By
re-arranging the classic equation \(N_t = N_0
e^{rt}\), we see that there is a linear relationship between
\(ln \left( \frac{N_t}{N_0} \right) = \mu
\cdot t\). \(N_t\) is the OD
threshold that we chose to use (so, 0.05 for now), \(N_0\) is the inoculum estimate, and \(t\) is the time to detection (TTD). So if
we put \(ln \left( \frac{N_t}{N_0}
\right)\) on the y-axis and TTD on the x-axis, the slope of the
line will be \(\mu\).
# create a new data.frame for storing final estimates
growth_dilutions <- TTD.df #%>% filter(Inoculum=="Exponential", Sample %in% paste0("BSC00",1:8))
# log convert the surviving N0
growth_dilutions$log10_surviving_N0 <- log10(growth_dilutions$surviving_N0)
# convert the N0 from CFU to OD
convert_CFU_to_OD <- function(CFU) {
if (CFU > 0){
return( 10^(-6.2836767 + 0.8954706*log10(CFU)) )
} else { # remove 0 values from data as these will yield division by 0
return(NA)
}
}
# estimate ln(N_t / N_0) in units of OD
growth_dilutions$inferredOD_survivingN0 <- sapply(growth_dilutions$surviving_N0,
convert_CFU_to_OD)
growth_dilutions <- growth_dilutions %>% mutate(ln_Ntsmall_over_N0 = log(0.05 / inferredOD_survivingN0),
ln_Ntbig_over_N0 = log(0.13 / inferredOD_survivingN0))
ggplot(growth_dilutions %>% filter(Inoculum=="Exponential"),
aes(y=ln_Ntsmall_over_N0, x=TTD_0.05, group=Temp, colour=as.factor(Temp))) +
facet_wrap(vars(Sample)) +
geom_point(alpha=0.5) +
geom_smooth(se=FALSE, method="lm", size=0.2) +
labs(title="Exponential; TTD cut-off 0.05",
y="ln(0.05 / OD converted surviving N0)",
x="Time to Detection (hrs)")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 140 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 140 rows containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(growth_dilutions %>% filter(Inoculum=="Exponential"),
aes(y=ln_Ntbig_over_N0, x=TTD_0.13, group=Temp, colour=as.factor(Temp))) +
facet_wrap(vars(Sample)) +
geom_point(alpha=0.5) +
geom_smooth(se=FALSE, method="lm", size=0.2) +
labs(title="Exponential; TTD cut-off 0.13",
y="ln(0.13 / OD converted surviving N0)",
x="Time to Detection (hrs)")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 142 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 142 rows containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(growth_dilutions %>% filter(Inoculum=="Stationary"),
aes(y=ln_Ntsmall_over_N0, x=TTD_0.05, group=Temp, colour=as.factor(Temp))) +
facet_wrap(vars(Sample)) +
geom_point(alpha=0.5) +
geom_smooth(se=FALSE, method="lm", size=0.2) +
labs(title="Stationary; TTD cut-off 0.05",
y="ln(0.05 / OD converted surviving N0)",
x="Time to Detection (hrs)")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 167 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 167 rows containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(growth_dilutions %>% filter(Inoculum=="Stationary"),
aes(y=ln_Ntbig_over_N0, x=TTD_0.13, group=Temp, colour=as.factor(Temp))) +
facet_wrap(vars(Sample)) +
geom_point(alpha=0.5) +
geom_smooth(se=FALSE, method="lm", size=0.2) +
labs(title="Stationary; TTD cut-off 0.13",
y="ln(0.13 / OD converted surviving N0)",
x="Time to Detection (hrs)")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 156 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 156 rows containing missing values or values outside the scale range
## (`geom_point()`).
# initialize variable for storage
Dil_growthrates.df <- data.frame(matrix(nrow=0, ncol=7))
# calculate the slope, sd, and r-squared of the slope
for(sam in unique(growth_dilutions$Sample)){
for(t in unique(growth_dilutions$Temp)){
for(inoc in unique(growth_dilutions$Inoculum)){
temp.df <- growth_dilutions %>% filter(Sample==sam, Temp==t, Inoculum==inoc)
if(sum(temp.df$mean_surviv, na.rm=TRUE)>0 # if CFU data indicates cells can survive
& # and
sum(!is.na(temp.df$TTD_0.05))>2){ # there are 3 or more non-NA TTD values
# fit the linear model directly on the raw CFU
tmp_lm <- lm(TTD_0.05 ~ log10_surviving_N0, temp.df)
# fit the linear model on ln(N_t / N_0) for N0 converted from CFU to OD
tmpOD_lm <- lm(TTD_0.05 ~ ln_Ntsmall_over_N0, temp.df)
# store the values
Dil_growthrates.df <- rbind(Dil_growthrates.df,
c(sam, t, inoc,
exp(coef(tmp_lm)[2]), # mean growth rate
exp(coef(tmp_lm)[2]-1.645*sqrt(diag(vcov(tmp_lm)))[2]), # lower CI of growth rate
exp(coef(tmp_lm)[2]+1.645*sqrt(diag(vcov(tmp_lm)))[2]), # upper CI of growth rate
summary(tmp_lm)$r.squared, # multiple R-squared
# also get the summary statistics for the lm with converted OD
1/coef(tmpOD_lm)[2],
1/(coef(tmpOD_lm)[2]+1.645*sqrt(diag(vcov(tmp_lm)))[2]),
1/(coef(tmpOD_lm)[2]-1.645*sqrt(diag(vcov(tmp_lm)))[2]),
summary(tmpOD_lm)$r.squared)
)
}
if(sum(temp.df$mean_surviv, na.rm=TRUE)==0 # if CFU data indicates cells CANNOT survive
| # or
sum(!is.na(temp.df$TTD_0.05))<3){ # if there are less than 3 non-NA TTD values
# store NA values
Dil_growthrates.df <- rbind(Dil_growthrates.df,
c(sam, t, inoc, rep(NA, 8))
)
tmp_lm <- temp.df <- tmpOD_lm <- NA
}
rm(tmp_lm, temp.df, tmpOD_lm)
}
}
}
# update the column names
colnames(Dil_growthrates.df) <- c("Sample", "Temp", "Inoculum",
"mu", "mu_lo_CI", "mu_hi_CI", "r_sq",
"OD_mu", "OD_mu_lo_CI", "OD_mu_hi_CI", "OD_r_sq")
# change Temp to a numeric from character
Dil_growthrates.df$Temp <- as.numeric(Dil_growthrates.df$Temp)
# change mu to a numeric from character
Dil_growthrates.df$mu <- as.numeric(Dil_growthrates.df$mu)
Dil_growthrates.df$OD_mu <- as.numeric(Dil_growthrates.df$OD_mu)
# change mu_lo_CI to a numeric from character
Dil_growthrates.df$mu_lo_CI <- as.numeric(Dil_growthrates.df$mu_lo_CI)
Dil_growthrates.df$OD_mu_lo_CI <- as.numeric(Dil_growthrates.df$OD_mu_lo_CI)
# change mu_hi_CI to a numeric from character
Dil_growthrates.df$mu_hi_CI <- as.numeric(Dil_growthrates.df$mu_hi_CI)
Dil_growthrates.df$OD_mu_hi_CI <- as.numeric(Dil_growthrates.df$OD_mu_hi_CI)
# change r_sq to a numeric from character
Dil_growthrates.df$r_sq <- as.numeric(Dil_growthrates.df$r_sq)
Dil_growthrates.df$OD_r_sq <- as.numeric(Dil_growthrates.df$OD_r_sq)
# add species/strain annotation
Dil_growthrates.df <- left_join(Dil_growthrates.df,
TTD.df %>% select(Sample, Species, Strain) %>% distinct())
## Adding missing grouping variables: `Temp`
## Joining with `by = join_by(Sample, Temp)`
# check the r-squared values
with(Dil_growthrates.df, hist(r_sq))
# plot just the linear regressions that had an r-sq < 0.9 (there are 11 of them in total)
# make a temporary data.frame for just the data whose linear regression r-sq are too small
temp.low_rsq <- Dil_growthrates.df %>% filter(r_sq < 0.9) %>% filter(r_sq > 0.85) %>% select(Sample, Temp, Inoculum)
temp.low_rsq <- inner_join(temp.low_rsq, growth_dilutions) %>%
unite("sam_temp_inoc", c(Sample, Temp, Inoculum), remove=FALSE)
## Joining with `by = join_by(Sample, Temp, Inoculum)`
# plot
ggplot(temp.low_rsq,
aes(x=log10_surviving_N0, y=TTD_0.05)) +
facet_wrap(vars(sam_temp_inoc)) +
geom_point(alpha=0.5) +
geom_smooth(se=FALSE, method="lm", size=0.2) +
labs(title="lm: 0.85 < r-sq < 0.9", x="log of N0",
y="Time to Detection (hrs)")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).
# do the same thing to plot linear regressions that were below 0.85
# make a temporary data.frame for just the data whose linear regression r-sq are too small
temp.low_rsq <- Dil_growthrates.df %>% filter(r_sq < 0.85) %>% select(Sample, Temp, Inoculum)
temp.low_rsq <- inner_join(temp.low_rsq, growth_dilutions) %>%
unite("sam_temp_inoc", c(Sample, Temp, Inoculum), remove=FALSE)
## Joining with `by = join_by(Sample, Temp, Inoculum)`
# plot
ggplot(temp.low_rsq,
aes(x=log10_surviving_N0, y=TTD_0.05)) +
facet_wrap(vars(sam_temp_inoc)) +
geom_point(alpha=0.5) +
geom_smooth(se=FALSE, method="lm", size=0.2) +
labs(title="lm: r-sq < 0.85", x="log of N0",
y="Time to Detection (hrs)")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 7 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 7 rows containing missing values or values outside the scale range
## (`geom_point()`).
# modify any observed NA values into zero's (because that's what they should be)
# NOTE THAT NOT ALL NA'S ARE ZEROS!: currently BSC008 exponential CFU data is missing and yielding spurious NA values
#Dil_growthrates.df$mu[is.na(Dil_growthrates.df$mu)] <- 0
# plot
ggplot(Dil_growthrates.df,
aes(x=Temp, y=mu, colour=Species, group=Species)) +
facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess") +
geom_point(alpha=0.25, na.rm=TRUE, position=position_dodge(width=1)) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=0.5, alpha=0.25, na.rm=TRUE, position=position_dodge(width=1)) +
scale_colour_manual(values=sp_palette) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")"))
)#+
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 19 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 1.224e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 1.224e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 3.4723e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 3.4723e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 4.896e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 4.896e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 1.224e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 1.224e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 3.4723e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 3.4723e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 4.896e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 4.896e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
#theme(legend.position="none")
ggplot(Dil_growthrates.df,
aes(x=Temp, y=mu, colour=Species, group=Species)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess",
# #formula=???,
) +
geom_point(alpha=0.2, na.rm=TRUE, position=position_dodge(width=1)) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=0, alpha=0.2, na.rm=TRUE, position=position_dodge(width=1)) +
scale_y_log10() +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")"))
)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 19 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 4.2401e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 4.2401e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 3.0071e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 3.0071e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 1.696e-16
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 1.696e-16
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101
# schematic of my 4 species that I want to look at (2 fast/2 slow x 2 sensitive/2 resistant)
ggplot(Dil_growthrates.df %>% filter(Species %in% c("P. plecoglossicida","P. putida", "P. veronii", "P. knackmussii")),
aes(x=Temp, y=mu, colour=Species)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess") +
#geom_point(alpha=0.25, na.rm=TRUE, position=position_dodge(width=1)) +
#geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
# width=0.5, alpha=0.25, na.rm=TRUE, position=position_dodge(width=1)) +
scale_colour_manual(values=sp_palette[c(2:3,5:6)]) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")")))
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 9 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 4.2401e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 4.2401e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 1.696e-16
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 1.696e-16
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101
#####
# Plan A (2-way design)
#####
# thermal performance curve of 1st possible fluorescent panel:
# P. veronii=BFP, P.knackmussii=GFP, P. putida=YFP, P. plecoglossicida-like=red dye
ggplot(Dil_growthrates.df %>% filter(Sample %in% c("BSC009", "BSC008", "BSC001", "BSC004")),
aes(x=Temp, y=mu, colour=Species)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess") +
geom_point(alpha=0.25, na.rm=TRUE, position=position_dodge(width=.5)) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=0.5, alpha=0.25, na.rm=TRUE, position=position_dodge(width=.5)) +
scale_colour_manual(values=sp_palette[c(2:3,5:6)]) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")")),
title="Plan A")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 4 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
# thermal performance curve of 2nd possible fluorescent panel:
# P. veronii=BFP, P.knackmussii=GFP, P. putida=YFP, P. plecoglossicida-like=red dye
ggplot(Dil_growthrates.df %>% filter(Sample %in% c("BSC009", "BSC008", "BSC002", "BSC004")),
aes(x=Temp, y=mu, colour=Species)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess") +
geom_point(alpha=0.25, na.rm=TRUE, position=position_dodge(width=.5)) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=0.5, alpha=0.25, na.rm=TRUE, position=position_dodge(width=0.5)) +
scale_colour_manual(values=sp_palette[c(2:3,5:6)]) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")")),
title="Panel 2: putida KT2440 YFP (BSC023)")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 4 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
# thermal performance curve of 3rd possible fluorescent panel:
# P. putida=BFP, P.knackmussii=GFP, P. veronii=mScarlet, P. plecoglossicida-like=red dye
ggplot(Dil_growthrates.df %>% filter(Sample %in% c("BSC009", "BSC008", "BSC003", "BSC005")),
aes(x=Temp, y=mu, colour=Species)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess") +
geom_point(alpha=0.25, na.rm=TRUE, position=position_dodge(width=.5)) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=0.5, alpha=0.25, na.rm=TRUE, position=position_dodge(width=.5)) +
scale_colour_manual(values=sp_palette[c(2:3,5:6)]) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")")),
title="Panel 3: putida uwc 2 BFP (BSC003), veronii mScarlet")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 4 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
#####
# Plan B (increasing growth rates at 30*C and heat at 40*C
#####
# thermal performance curve of 1st possible fluorescent panel:
# P. veronii=BFP, P.grimontii=GFP, P. putida=YFP, P.protegens=mTourqoise
plot_growthrates.df <- Dil_growthrates.df %>% filter(Sample %in% c("BSC019", "CK101", "BSC001", "BSC005"),
Inoculum == "Exponential")
plot_growthrates.df$mu[which(is.na(plot_growthrates.df$mu))] <- 0
plot_growthrates.df$Shape <- ifelse(plot_growthrates.df$mu==0, "\u2620", "\u25cf")
ggplot(plot_growthrates.df,
aes(x=Temp, y=OD_mu, colour=Species)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess", alpha=0.5) +
geom_point(position=position_dodge(width=.5),
shape = plot_growthrates.df$Shape, size=4) +
geom_errorbar(aes(ymin=OD_mu_lo_CI, ymax=OD_mu_hi_CI),
width=1, na.rm=TRUE, position=position_dodge(width=.5)) +
scale_colour_manual(values=sp_palette[c(1,4:6)]) +
#scale_y_continuous(limits=c(0,0.25)) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")")),
title="Exponential Inoculum")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).
rm(plot_growthrates.df)
plot_growthrates.df <- Dil_growthrates.df %>% filter(Sample %in% c("BSC019", "CK101", "BSC001", "BSC005"),
Inoculum == "Stationary")
plot_growthrates.df$mu[which(is.na(plot_growthrates.df$mu))] <- 0
plot_growthrates.df$Shape <- ifelse(plot_growthrates.df$mu==0, "\u2620", "\u25cf")
ggplot(plot_growthrates.df,
aes(x=Temp, y=OD_mu, colour=Species)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess", alpha=0.5) +
geom_point(position=position_dodge(width=.5),
shape = plot_growthrates.df$Shape, size=4) +
geom_errorbar(aes(ymin=OD_mu_lo_CI, ymax=OD_mu_hi_CI),
width=1, na.rm=TRUE, position=position_dodge(width=.5)) +
scale_colour_manual(values=sp_palette[c(1,4:6)]) +
#scale_y_continuous(limits=c(0,0.25)) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")")),
title="Stationary Inoculum")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.95
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 5.05
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 25.502
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.95
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 5.05
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 25.502
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).
rm(plot_growthrates.df)
####
# All 6 species with little skulls
####
plot_growthrates.df <- Dil_growthrates.df %>% filter(Inoculum == "Stationary")
plot_growthrates.df$mu[which(is.na(plot_growthrates.df$mu))] <- 0
plot_growthrates.df$Shape <- ifelse(plot_growthrates.df$mu==0, "\u2620", "\u25cf")
ggplot(plot_growthrates.df,
aes(x=Temp, y=mu, colour=Species)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp), stat="smooth", method="loess") +
geom_point(position=position_dodge(width=.5),
shape = plot_growthrates.df$Shape, size=4,
alpha=0.5) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=1, na.rm=TRUE, position=position_dodge(width=.5)) +
scale_colour_manual(values=sp_palette) +
#scale_y_continuous(limits=c(0,0.23)) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate (", hr^{-1},")")),
title="Stationary Inoculum")
## `geom_smooth()` using formula = 'y ~ x'
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 1.224e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 1.224e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 4.896e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 4.896e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 4.896e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 4.896e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 8.655e-17
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 8.655e-17
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
rm(plot_growthrates.df)
#####
# Research Practical
#####
plot_growthrates.df <- Dil_growthrates.df %>% filter(Sample %in% c("BSC001", "BSC004"))
plot_growthrates.df$mu[which(is.na(plot_growthrates.df$mu))] <- 0
plot_growthrates.df$Shape <- ifelse(plot_growthrates.df$mu==0, "\u2620", "\u25cf")
ggplot(plot_growthrates.df,
aes(x=Temp, y=mu, colour=Species, group=Inoculum)) +
#facet_grid(. ~ Inoculum) +
# add a smoothed line to join the different temperatures
geom_line(aes(x=Temp, group=Species), stat="smooth", method="loess", alpha=0.5) +
geom_point(position=position_dodge(width=1),
shape = plot_growthrates.df$Shape, size=4) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=.5, na.rm=TRUE, position=position_dodge(width=1)) +
scale_colour_manual(values=sp_palette[c(5,2)]) +
#scale_y_continuous(limits=c(0,0.23)) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Biomass Growth Rate ", (hr^{-1}))))
## `geom_smooth()` using formula = 'y ~ x'
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 24.925
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 10.075
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 101.51
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 24.925
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 10.075
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 101.51
rm(plot_growthrates.df)
# plot the data a different way to compare the effect of inoculum phase on estimated growth rate
ggplot(Dil_growthrates.df,
aes(x=Species, y=mu, colour=Inoculum)) +
facet_wrap(vars(Temp), scales="free") +
geom_point(alpha=0.5) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=0, alpha=0.5) +
labs(x=paste0("Species"),
y=expression(paste("Net Growth Rate (", hr^{-1},")"))
) +
theme(axis.text.x=element_blank())
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_point()`).
# to plot the effect size on batch culture growth rate, we need to first calculate the growth rate relative to 30*C
relative_growthrates <- Dil_growthrates.df %>% filter(Temp > 30) %>% select(-r_sq)
# add the growth rate at 30*C and its CI's back as a column
temp_30growth <- Dil_growthrates.df %>% filter(Temp == 30) %>%
select(-r_sq, -Species, -Strain, -Temp) %>%
rename(mu30=mu, mu30_lo_CI=mu_lo_CI, mu30_hi_CI=mu_hi_CI)
relative_growthrates <- left_join(relative_growthrates, temp_30growth)
## Joining with `by = join_by(Sample, Inoculum, OD_mu, OD_mu_lo_CI, OD_mu_hi_CI,
## OD_r_sq)`
# calculate the effect size
relative_growthrates <- relative_growthrates %>% mutate(relative_mu = mu/mu30)
ggplot(relative_growthrates,
aes(y=relative_mu, x=Species)) +
facet_grid(Inoculum ~ Temp) +
geom_hline(yintercept = 1) +
geom_jitter(width=0.2, alpha=0.5, aes(colour=Sample)) +
# show the mean and confidence intervals using "mean_cl_boot": nonparametric bootstrap for obtaining confidence limits for the population mean without assuming normality
#stat_summary(fun.data = "mean_cl_boot", color = "black", alpha=0.7, size=0.2, na.rm = TRUE)+
theme(axis.text.x=element_text(angle = 60, hjust = 0.95),
legend.position="none") +
labs(y="Effect Size (Batch culture growth)",
title="Mean growth rate compared to 30*C")
## Warning in min(x): no non-missing arguments to min; returning Inf
## Warning in max(x): no non-missing arguments to max; returning -Inf
## Warning in min(d[d > tolerance]): no non-missing arguments to min; returning
## Inf
## Warning in min(x): no non-missing arguments to min; returning Inf
## Warning in max(x): no non-missing arguments to max; returning -Inf
## Warning in stats::runif(length(x), -amount, amount): NAs produced
## Warning: Removed 64 rows containing missing values or values outside the scale range
## (`geom_point()`).
rm(temp.low_rsq)
From the plots of the entire data, it seems that only BSC019 at 35C (definitely stationary and perhaps also exponential phase inoculum) is exhibiting a clear lag time (i.e., non-linear trend where the time to detection is smaller than expected for high inoculum sizes). It would be good to know which samples were started off above the threshold of detection to understand if there really is no lag time here.
Most of the growth curves yielded a good linear relationship with the starting inoculum size (linear regression \(r^2 > 0.90\)). Above I have plotted the linear regressions that had \(r^2\) values below 0.90. Honestly, by eye the only linear regression I would drop is for BSC005 exponential at 35C (this would make the cut off \(r^2 > 0.70\)).
Notice that BSC019 (at all temperatures) consistently had an \(r^2\) above 0.9, although it looks like it is exhibiting a non-linear trend. This is annoying because it suggests that \(r^2\) alone is not a good metric for what I’m trying to see. It may be a good idea to use AIC to compare the linear model against a quadratic/cubic or a polynomial fit. Then it would be possible to report which samples/temperatures/inoculum-phase exhibited no lag (i.e., linear trend preferred) or something else (i.e., non-linear trend).
Finally, it seems that the estimates for the growth rates in fact do not depend at all on the starting inoculum phase. Given that we have already taken into account the inoculum size using CFU estimates and survival, this is quite reassuring and as expected. I will keep the exponential and stationary inoculum size data and use it to increase the number of replicates when fitting the Arrhenius equation.
Here is some code below where I tried to fit an entirely arbitrary
Arrhenius equation. Instead of using method = loess it
would be much more reasonable to fit an Arrhenius equation.
Here is some code below where I tried to fit an entirely arbitrary Arrhenius equation from Corkrey et al. 2012. The model didn’t fit the data very well at all. That’s why I’ve commented it out.
# Specify the thermal performance curve from Corkrey et al. 2012
predicted_growthrate <- function(const, Temp_in_C){
# the scaling constant is the only thing that's not given in the paper so I'm using that as an unknown value with the same prior distribution as used in the paper to fit the thermal performance curve for each of the 3 species
K <- Temp_in_C + 273.15 # convert to Kelvin
# all the following values are taken directly from the paper
R <- 8.314 # gas constant
deltaH_star <- 4970 # Enthalpy change (Table 1)
deltaS_star <- 17.2 # Entropy change (Table 1)
T_H <- 375.6 # Convergence temperature for enthalpy (Table 1)
T_S <- 390.2 # Convergence temperature for entropy (Table 1)
deltaH_A <- 67549 # enthalpy of activation for all bacteria (Table 2)
deltaC <- 62.9 # Heat capacity change for all bacteria (Table 2)
n_aa <- 259.2 # number of a-a residues for all bacteria (Table 2)
Denominator <- 1+exp(-n_aa*(deltaH_star - K*deltaS_star + deltaC*((K-T_H) - K*log(K/T_S) ))/(R*K)) # from equation 2
F_ <- sqrt(K * exp(const-deltaH_A/(R*K)) / Denominator) # from equation 1
return(F_)
# cleanup
rm(K, R, deltaH_star, deltaS_star, T_H, T_S, deltaH_A, deltaC, n_aa, Denominator, F_)
}
# find the scaling constant for each species by minimizing the residual sum of squares
SSE_fun <- function(c, which_species){
# calculate the square errors
df <- Dil_growthrates.df %>%
filter(Species == which_species) %>%
mutate(SE = (mu-predicted_growthrate(c, Temp))^2)
# return the sum
return(sum(df$SE))
rm(df)
}
# estimate the best fitting c value for each of the 3 species
# use "Brent" method because it allows lower and upper bounds
Pputida_fit <- optim(20, function(x) SSE_fun(x, "P. putida"),
lower=-2, upper=40, method="Brent") # use the bounds on c from the paper (Table S2)
Pknack_fit <- optim(20, function(x) SSE_fun(x, "P. knackmussii"),
lower=-2, upper=40, method="Brent")
Pveron_fit <- optim(20, function(x) SSE_fun(x, "P. veronii"),
lower=-2, upper=40, method="Brent")
# add the estimated model parameters to the data.frame
Dil_growthrates.df$TPC_c_est <- NA
Dil_growthrates.df$TPC_c_est[Dil_growthrates.df$Species == "P. putida"] <- Pputida_fit$par
Dil_growthrates.df$TPC_c_est[Dil_growthrates.df$Species == "P. knackmussii"] <- Pknack_fit$par
Dil_growthrates.df$TPC_c_est[Dil_growthrates.df$Species == "P. veronii"] <- Pveron_fit$par
# add the model predictions to the data.frame
Dil_growthrates.df <- Dil_growthrates.df %>% mutate(mu_modelPredict = predicted_growthrate(TPC_c_est, Temp))
# plot the model predictions and the data
ggplot(Dil_growthrates.df,
aes(x=jitterTemp, y=mu, colour=Species)) +
# plot the thermal performance curve
geom_line(aes(x=Temp, y=mu_modelPredict), alpha=0.5) +
geom_point(alpha=0.75) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=0, alpha=0.75) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Net Growth Rate (", hr^{-1},")"))
)
# cleanup
rm(Pknack_fit, Pputida_fit, Pveron_fit, sam, t)
As discussed in a recent article, I should do a better analysis of which model is the best one to use. They recommend 1) using only models with fewer parameters than the number of temperatures (i.e., for us, 3 or less) and 2) fitting models that are quite different from each other (i.e., illustrated in their dendogram, Fig. 3).
I found a package
by the same lab as above that allows fitting of multiple thermal
performance curves. Here I have just copy/pasted the code from
vignette("fit_many_models") with the P. knackmussii data to
see what it looks like.
TO DO: - select a subset of distinct models with 3 parameters or less - fit all the samples to these models to select the single best one - get the parameter estimates.
# write function to label ggplot2 panels
label_facets_num <- function(string){
len <- length(string)
string = paste('(', 1:len, ') ', string, sep = '')
return(string)
}
# keep just the data from a single species
d <- Dil_growthrates.df %>% filter(Species == "P. knackmussii") %>% select(Temp, mu) %>% rename(temp=Temp, rate=mu)
# show the data
ggplot(d, aes(temp, rate)) +
geom_point() +
theme_bw(base_size = 12) +
labs(x = 'Temperature (ºC)',
y = 'Growth rate',
title = 'Sanity check of the P. knackmussii dataframe')
# manually select the models that are successfully fitted
d_fits <- nest(d, data = c(temp, rate)) %>%
mutate(quadratic = map(data, ~nls_multstart(rate~quadratic_2008(temp = temp, a, b, c),
data = .x,
iter = c(4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'quadratic_2008') - 0.5,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'quadratic_2008') + 0.5,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'quadratic_2008'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'quadratic_2008'),
supp_errors = 'Y',
convergence_count = FALSE)),
pawar = map(data, ~nls_multstart(rate~pawar_2018(temp = temp, r_tref, e, eh, topt, tref = 15),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'pawar_2018') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'pawar_2018') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'pawar_2018'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'pawar_2018'),
supp_errors = 'Y',
convergence_count = FALSE)),
modifiedgaussian = map(data, ~nls_multstart(rate~modifiedgaussian_2006(temp = temp, rmax, topt, a, b),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'modifiedgaussian_2006') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'modifiedgaussian_2006') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'modifiedgaussian_2006'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'modifiedgaussian_2006'),
supp_errors = 'Y',
convergence_count = FALSE)),
lrf = map(data, ~nls_multstart(rate~lrf_1991(temp = temp, rmax, topt, tmin, tmax),
data = d,
iter = c(3,3,3,3),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'lrf_1991') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'lrf_1991') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'lrf_1991'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'lrf_1991'),
supp_errors = 'Y',
convergence_count = FALSE)),
lactin2 = map(data, ~nls_multstart(rate~lactin2_1995(temp = temp, a, b, tmax, delta_t),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'lactin2_1995') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'lactin2_1995') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'lactin2_1995'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'lactin2_1995'),
supp_errors = 'Y',
convergence_count = FALSE)),
johnson_lewin = map(data, ~suppressWarnings(nls_multstart(rate~ johnsonlewin_1946(temp = temp, r0, e, eh, topt),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'johnsonlewin_1946') - 1,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'johnsonlewin_1946') + 1,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'johnsonlewin_1946'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'johnsonlewin_1946'),
supp_errors = 'Y',
convergence_count = FALSE))),
hinshelwood = map(data, ~nls_multstart(rate~hinshelwood_1947(temp = temp, a, e, b, eh),
data = .x,
iter = c(5,5,5,5),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'hinshelwood_1947') - 1,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'hinshelwood_1947') + 1,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'hinshelwood_1947'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'hinshelwood_1947'),
supp_errors = 'Y',
convergence_count = FALSE)),
gaussian = map(data, ~nls_multstart(rate~gaussian_1987(temp = temp, rmax, topt, a),
data = .x,
iter = c(4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'gaussian_1987') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'gaussian_1987') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'gaussian_1987'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'gaussian_1987'),
supp_errors = 'Y',
convergence_count = FALSE)),
flinn = map(data, ~nls_multstart(rate~flinn_1991(temp = temp, a, b, c),
data = .x,
iter = c(5,5,5),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'flinn_1991') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'flinn_1991') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'flinn_1991'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'flinn_1991'),
supp_errors = 'Y',
convergence_count = FALSE)),
deutsch = map(data, ~nls_multstart(rate~deutsch_2008(temp = temp, rmax, topt, ctmax, a),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'deutsch_2008') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'deutsch_2008') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'deutsch_2008'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'deutsch_2008'),
supp_errors = 'Y',
convergence_count = FALSE)),
briere2 = map(data, ~nls_multstart(rate~briere2_1999(temp = temp, tmin, tmax, a,b),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'briere2_1999') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'briere2_1999') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'briere2_1999'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'briere2_1999'),
supp_errors = 'Y',
convergence_count = FALSE)),
ratkowsky = map(data, ~nls_multstart(rate~ratkowsky_1983(temp = temp, tmin, tmax, a, b),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'ratkowsky_1983') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'ratkowsky_1983') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'ratkowsky_1983'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'ratkowsky_1983'),
supp_errors = 'Y',
convergence_count = FALSE)),
sharpeschoolhigh = map(data, ~nls_multstart(rate~sharpeschoolhigh_1981(temp = temp, r_tref,e,eh,th, tref = 15),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'sharpeschoolhigh_1981') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'sharpeschoolhigh_1981') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'sharpeschoolhigh_1981'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'sharpeschoolhigh_1981'),
supp_errors = 'Y',
convergence_count = FALSE)),
spain = map(data, ~nls_multstart(rate~spain_1982(temp = temp, a,b,c,r0),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'spain_1982') - 1,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'spain_1982') + 1,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'spain_1982'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'spain_1982'),
supp_errors = 'Y',
convergence_count = FALSE)),
thomas1 = map(data, ~nls_multstart(rate~thomas_2012(temp = temp, a,b,c,topt),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'thomas_2012') - 1,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'thomas_2012') + 2,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'thomas_2012'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'thomas_2012'),
supp_errors = 'Y',
convergence_count = FALSE)),
weibull = map(data, ~nls_multstart(rate~weibull_1995(temp = temp, a,topt,b,c),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'weibull_1995') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'weibull_1995') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'weibull_1995'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'weibull_1995'),
supp_errors = 'Y',
convergence_count = FALSE))
)
glimpse(select(d_fits, 1:7))
d_fits$quadratic[[1]]
# stack models
d_stack <- select(d_fits, -data) %>%
pivot_longer(., names_to = 'model_name', values_to = 'fit', quadratic:weibull)
# get parameters using tidy
params <- d_stack %>%
mutate(., est = map(fit, tidy)) %>%
select(-fit) %>%
unnest(est)
# get predictions using augment
newdata <- tibble(temp = seq(min(d$temp), max(d$temp), length.out = 100))
d_preds <- d_stack %>%
mutate(., preds = map(fit, augment, newdata = newdata)) %>%
select(-fit) %>%
unnest(preds)
# plot
ggplot(d_preds, aes(temp, rate)) +
geom_point(aes(temp, rate), d) +
geom_line(aes(temp, .fitted), col = 'blue') +
facet_wrap(~model_name, labeller = labeller(model_name = label_facets_num), scales = 'free', ncol = 5) +
theme_bw(base_size = 12) +
theme(legend.position = 'none',
strip.text = element_text(hjust = 0),
strip.background = element_blank()) +
labs(x = 'Temperature (ºC)',
y = 'Metabolic rate',
title = 'Fits of 17 models available in rTPC') +
geom_hline(aes(yintercept = 0), linetype = 2)
Models thomas1, ratkowsky, and
pawar seem to look the best for all 3 strains. Let’s fit
and plot them again…
# keep just the data from the first species
d.p <- Dil_growthrates.df %>% filter(Species == "P. putida") %>% select(Temp, mu) %>% rename(temp=Temp, rate=mu)
# fit the 3 models that looked best by eye
p_fits <- nest(d.p, data = c(temp, rate)) %>%
mutate(thomas1 = map(data, ~nls_multstart(rate~thomas_2012(temp = temp, a,b,c,topt),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'thomas_2012') - 1,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'thomas_2012') + 2,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'thomas_2012'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'thomas_2012'),
supp_errors = 'Y',
convergence_count = FALSE)),
ratkowsky = map(data, ~nls_multstart(rate~ratkowsky_1983(temp = temp, tmin, tmax, a, b),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'ratkowsky_1983') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'ratkowsky_1983') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'ratkowsky_1983'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'ratkowsky_1983'),
supp_errors = 'Y',
convergence_count = FALSE)),
pawar = map(data, ~nls_multstart(rate~pawar_2018(temp = temp, r_tref, e, eh, topt, tref = 15),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'pawar_2018') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'pawar_2018') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'pawar_2018'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'pawar_2018'),
supp_errors = 'Y',
convergence_count = FALSE))
)
# keep just the data from the second species
d.v <- Dil_growthrates.df %>% filter(Species == "P. veronii") %>% select(Temp, mu) %>% rename(temp=Temp, rate=mu)
# fit the 3 models that looked best by eye
v_fits <- nest(d.v, data = c(temp, rate)) %>%
mutate(thomas1 = map(data, ~nls_multstart(rate~thomas_2012(temp = temp, a,b,c,topt),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'thomas_2012') - 1,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'thomas_2012') + 2,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'thomas_2012'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'thomas_2012'),
supp_errors = 'Y',
convergence_count = FALSE)),
ratkowsky = map(data, ~nls_multstart(rate~ratkowsky_1983(temp = temp, tmin, tmax, a, b),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'ratkowsky_1983') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'ratkowsky_1983') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'ratkowsky_1983'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'ratkowsky_1983'),
supp_errors = 'Y',
convergence_count = FALSE)),
pawar = map(data, ~nls_multstart(rate~pawar_2018(temp = temp, r_tref, e, eh, topt, tref = 15),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'pawar_2018') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'pawar_2018') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'pawar_2018'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'pawar_2018'),
supp_errors = 'Y',
convergence_count = FALSE))
)
# keep just the data from the last species
d.k <- Dil_growthrates.df %>% filter(Species == "P. knackmussii") %>% select(Temp, mu) %>% rename(temp=Temp, rate=mu)
# fit the 3 models that looked best by eye
k_fits <- nest(d.k, data = c(temp, rate)) %>%
mutate(thomas1 = map(data, ~nls_multstart(rate~thomas_2012(temp = temp, a,b,c,topt),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'thomas_2012') - 1,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'thomas_2012') + 2,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'thomas_2012'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'thomas_2012'),
supp_errors = 'Y',
convergence_count = FALSE)),
ratkowsky = map(data, ~nls_multstart(rate~ratkowsky_1983(temp = temp, tmin, tmax, a, b),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'ratkowsky_1983') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'ratkowsky_1983') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'ratkowsky_1983'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'ratkowsky_1983'),
supp_errors = 'Y',
convergence_count = FALSE)),
pawar = map(data, ~nls_multstart(rate~pawar_2018(temp = temp, r_tref, e, eh, topt, tref = 15),
data = .x,
iter = c(4,4,4,4),
start_lower = get_start_vals(.x$temp, .x$rate, model_name = 'pawar_2018') - 10,
start_upper = get_start_vals(.x$temp, .x$rate, model_name = 'pawar_2018') + 10,
lower = get_lower_lims(.x$temp, .x$rate, model_name = 'pawar_2018'),
upper = get_upper_lims(.x$temp, .x$rate, model_name = 'pawar_2018'),
supp_errors = 'Y',
convergence_count = FALSE))
)
# stack models across all 3 species
model_stack <- select(p_fits, -data) %>%
pivot_longer(., names_to = 'model_name', values_to = 'fit', thomas1:pawar)
model_stack$Species <- "P. putida"
temp <- select(v_fits, -data) %>%
pivot_longer(., names_to = 'model_name', values_to = 'fit', thomas1:pawar)
temp$Species <- "P. veronii"
model_stack <- rbind(model_stack, temp)
temp <- select(k_fits, -data) %>%
pivot_longer(., names_to = 'model_name', values_to = 'fit', thomas1:pawar)
temp$Species <- "P. knackmussii"
model_stack <- rbind(model_stack, temp)
#clean up
rm(temp, d.p, d.v, d.k, p_fits, v_fits, k_fits)
# get the data back again for predictions and plotting
d <- Dil_growthrates.df %>% select(Species, Temp, mu) %>% rename(temp=Temp, rate=mu)
# get parameters using tidy
params <- model_stack %>%
mutate(., est = map(fit, tidy)) %>%
select(-fit) %>%
unnest(est)
# get predictions using augment
newdata <- tibble(temp = seq(min(d$temp), max(d$temp), length.out = 100))
predictions <- model_stack %>%
mutate(., preds = map(fit, augment, newdata = newdata)) %>%
select(-fit) %>%
unnest(preds)
# plot
ggplot(predictions, aes(temp, rate)) +
geom_point(aes(temp, rate), d) +
geom_line(aes(temp, .fitted), col = 'blue') +
facet_grid(Species~model_name, labeller = labeller(model_name = label_facets_num), scales = 'free') +
theme_bw(base_size = 12) +
theme(legend.position = 'none',
strip.text = element_text(hjust = 0),
strip.background = element_blank()) +
labs(x = 'Temperature (ºC)',
y = 'Growth rate') +
geom_hline(aes(yintercept = 0), linetype = 2)
I like the way the Thomas1 model fits. There’s no good reason for this except that I think it looks nice so that’s the one that I will plot on my poster.
ggplot(Dil_growthrates.df,
aes(x=jitterTemp, y=mu, colour=Species)) +
geom_hline(yintercept = 0, colour="grey") +
scale_colour_manual(values=c("#9632B8","#EEA236","#357EBD")) +
# plot the thermal performance curve
geom_line(data=predictions %>% filter(model_name=="thomas1"),
aes(temp, .fitted), alpha=0.3, size=1) +
geom_point(alpha=0.6) +
geom_errorbar(aes(ymin=mu_lo_CI, ymax=mu_hi_CI),
width=0, alpha=0.6) +
labs(x=paste0("Temperature (", "\u00B0", "C)"),
y=expression(paste("Growth Rate (", hr^{-1},")"))
)
Let’s make some plots of the raw data. P. protegens at stationary phase 40*C shows something interesting/unexpected. Let’s also just plot the dilution series with the TTD line as an example.
ggplot(ALL_data.df %>% filter(Temp == 40, Dilution %in% c(0.1, 0.01),
Inoculum == "Stationary",
Species %in% c("P. putida", "P. protegens", "P. veronii")),
aes(x=Time, y=baselinedOD, colour=Species, group=Species)) +
#facet_wrap(~ Dilution) +
scale_colour_manual(values=sp_palette[4:6]) +
#geom_point(alpha=0.01) +
#geom_line(aes(x=Time), stat="smooth", method="loess") +
scale_y_log10(limits=c(0.0001, 1.5)) +
labs(x="Time (hrs)", y="Total Biomass (OD at 600nm)",
title="Growth at 40*C for stationary inoculum")
## Warning in transformation$transform(x): NaNs produced
## Warning in scale_y_log10(limits = c(1e-04, 1.5)): log-10 transformation
## introduced infinite values.
ggplot(ALL_data.df %>% filter(Temp == 40, Dilution %in% c(0.1, 0.01),
Inoculum == "Exponential",
Species %in% c("P. putida", "P. protegens", "P. veronii")),
aes(x=Time, y=baselinedOD, colour=Species, group=Species)) +
#facet_wrap(~ Dilution) +
scale_colour_manual(values=sp_palette[4:6]) +
#geom_point(alpha=0.01) +
#geom_line(aes(x=Time), stat="smooth", method="loess") +
scale_y_log10(limits=c(0.0001, 1.5)) +
labs(x="Time (hrs)", y="Total Biomass (OD at 600nm)",
title="Growth at 40*C for exponential inoculum")
## Warning in transformation$transform(x): NaNs produced
## Warning in transformation$transform(x): log-10 transformation introduced
## infinite values.
dil_palette = brewer.pal(11, "Spectral")[seq(from=1, to=11, by=2)]
ggplot(ALL_data.df %>% filter(Temp == 30, Inoculum == "Exponential",
Sample == "BSC001", Time < 48),
aes(x=Time, y=baselinedOD, colour=Dilution, group=uniqID)) +
scale_colour_manual(values=dil_palette) +
geom_point(size=0.1) +
#geom_hline(yintercept = 0.05) +
scale_y_continuous(limits=c(0.001, 1.0)) +
labs(x="Time (hrs)", y="Total Biomass (OD at 600nm)",
title="P. putida exponential inoculum at 30*C")
## Warning: Removed 1003 rows containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(ALL_data.df %>% filter(Temp == 30, Inoculum == "Exponential",
Sample == "BSC001", Time < 13),
aes(x=Time, y=baselinedOD, colour=Dilution, group=uniqID)) +
scale_colour_manual(values=dil_palette) +
geom_point(size=0.6) +
scale_y_log10(limits=c(0.001, .6)) +
geom_hline(yintercept = 0.05) +
labs(x="Time (hrs)", y="Total Biomass (OD at 600nm)",
title="P. putida at 30*C on log scale with TTD")
## Warning in transformation$transform(x): NaNs produced
## Warning in scale_y_log10(limits = c(0.001, 0.6)): log-10 transformation
## introduced infinite values.
## Warning: Removed 597 rows containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(ALL_data.df %>% filter(Temp == 30, Inoculum == "Exponential",
Sample == "BSC001", Time < 13),
aes(x=Time, y=baselinedOD, colour=Dilution, group=uniqID)) +
scale_colour_manual(values=dil_palette) +
geom_line() +
scale_y_log10(limits=c(0.001, .6)) +
geom_hline(yintercept = 0.05) +
labs(x="Time (hrs)", y="Total Biomass (OD at 600nm)",
title="P. putida at 30*C on log scale with TTD")
## Warning in transformation$transform(x): NaNs produced
## Warning in scale_y_log10(limits = c(0.001, 0.6)): log-10 transformation
## introduced infinite values.
## Warning: Removed 545 rows containing missing values or values outside the scale range
## (`geom_line()`).
ggplot(growth_dilutions %>% filter(Inoculum=="Exponential", Sample == "BSC001", Temp==30),
aes(x=10^log10_surviving_N0, y=TTD_0.05)) +
geom_point(alpha=0.5) +
geom_smooth(method="lm", size=0.2) +
scale_x_log10() +
labs(title="P. putida exponential inoculum at 30*C", x="Inferred Inoculum Size of Dilution (CFU)",
y="Time to Detection (hrs)", colour="Temperature (*C)")
## `geom_smooth()` using formula = 'y ~ x'
ggplot(growth_dilutions %>% filter(Inoculum=="Exponential", Sample == "BSC001"),
aes(x=10^log10_surviving_N0, y=TTD_0.05, group=Temp, colour=as.factor(Temp))) +
geom_point(alpha=0.5) +
geom_smooth(method="lm", size=0.2) +
scale_x_log10() +
labs(title="P. putida exponential inoculum", x="Inferred Inoculum Size of Dilution (CFU)",
y="Time to Detection (hrs)", colour="Temperature (*C)")
## `geom_smooth()` using formula = 'y ~ x'
Rstudio is having some issues so I put this text here maybe it will fix the problem?
20 November 2024: I am having trouble fitting the data from the main experiment because the dynamics seem to be more complex than I expected. Catalina suggested that Lotka Voltera is weird because it assumes a linear density dependence of per capita growth rate; for a lot of species, this is not the right relationship. Maybe I already have data that can be used to understand this better and see if LV makes sense for my data (or if it can be simplified somehow). Moreover, maybe we can get an empirical idea of how intrinsic growth rate and density dependence co-vary at different temperatures.
For now, I am approximating \(\frac{dN}{dt}\) by using \(\Delta N = N_{t+1}-N_t\). It may be possible to make things look nicer by fitting a smoothed spline fit to the data and calculating the derivatives from that. The problem (as cited here) is that this tends to multiply any noise in the data. So I’m avoiding that as a first pass.
Remember that the \(\mu\) values estimated above are in units of \(hr^{-1}\). Meanwhile, when we estimate \(\Delta N\) by using subsequent time-steps that are 10 minutes apart, the instantaneous per capita growth rate estimate is in units of \(0.6 hr^{-1}\). That’s why all of the plots below display \(0.6 \cdot \mu\)When the \(\mu\).
# sort first by uniqID then by Time
ALL_data.df <- ALL_data.df %>% arrange(uniqID, Time)
# convert the single data.frame into a list of data.frames, each with 1 time series
ALL_data.list <- split(ALL_data.df,
f = ALL_data.df$uniqID)
# a function to create a column for N_t+1
Ntplus1_column <- function(df) {
df$OD_plus1 <- c(df$baselinedOD[2:nrow(df)], NA)
return(df)
}
# get N_t+1 for each of the uniqID's
ALL_data.list <- lapply(ALL_data.list, Ntplus1_column)
# put the data back into a single data.frame
ALL_data.df <- bind_rows(ALL_data.list)
rm(ALL_data.list, Ntplus1_column)
# calculate \Delta N and its per capita value
ALL_data.df <- ALL_data.df %>% mutate(DeltaN = OD_plus1 - baselinedOD) %>%
mutate(DNperCapita = DeltaN / baselinedOD)
# a function to plot per capita \Delta N (y-axis) against OD (x-axis)
plot_percapita_DN <- function(sampleID, temperature,
min_OD = 0.02,
max_OD = 0.5) {
# let's get the estimated mu values
i <- which(Dil_growthrates.df$Temp==temperature & Dil_growthrates.df$Sample==sampleID)
mu_min <- 0.6 * min(c(Dil_growthrates.df$OD_mu_lo_CI[i], Dil_growthrates.df$OD_mu_hi_CI[i]),
na.rm = TRUE)
mu_max <- 0.6 * max(c(Dil_growthrates.df$OD_mu_lo_CI[i], Dil_growthrates.df$OD_mu_hi_CI[i]),
na.rm = TRUE)
# plot per capita \Delta N as points
out <- ggplot(ALL_data.df %>% filter(Sample == sampleID,
Temp == temperature) %>% #,
#Inoculum == "Stationary") %>%
filter(baselinedOD > min_OD, baselinedOD < max_OD),
aes(x=baselinedOD,
y=DNperCapita,
colour=as.factor(Dilution))) +
# ribbon for the estimated mu values
geom_ribbon(aes(ymin=mu_min, ymax=mu_max),
fill = "grey70", colour = NA) +
geom_point(alpha=0.2) +
geom_line(stat="smooth") +
labs(title=paste0(sampleID, " at ", temperature, "C: ",
min_OD, " < OD < ", max_OD),
y="per capita Delta N",
colour="Dilution\n of\nInoculum") +
# vertical line indicates TTD
geom_vline(xintercept = 0.05, linetype="dashed")
return(out)
}
# plot an example
ggplot(ALL_data.df %>% filter(uniqID == "E3 1 2023-11-20 Stationary"),
aes(x=baselinedOD, y=DNperCapita)) +
geom_point() +
labs(title="all N values",
y="per capita Delta N")
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(ALL_data.df %>% filter(Sample == "BSC001",
Temp == 30) %>% #,
#Inoculum == "Stationary") %>%
filter(baselinedOD > 0.02,
baselinedOD < 0.5),
aes(x=baselinedOD, y=DNperCapita, colour=as.factor(Dilution))) +
geom_point(alpha=0.2) +
labs(title="BSC001 30C: 0.02 < OD < 0.5",
y="per capita Delta N") +
geom_vline(xintercept = 0.05, linetype="dashed") + # vertical line indicates TTD
geom_hline(yintercept = 0.6 * Dil_growthrates.df$OD_mu[which(Dil_growthrates.df$Temp==30 & Dil_growthrates.df$Sample=="BSC001")],
linetype="dashed")
for (genotypes in unique(ALL_data.df$Sample)) {
for (tempC in unique(ALL_data.df$Temp)) {
plot(plot_percapita_DN(sampleID=genotypes, temperature=tempC))
}
}
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 10 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 10 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 4 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 5 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 5 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 7 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 7 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 5 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 5 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 4 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 10 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 10 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
## Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 9 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 9 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 11 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 11 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning in min(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to min;
## returning Inf
## Warning in max(c(Dil_growthrates.df$OD_mu_lo_CI[i],
## Dil_growthrates.df$OD_mu_hi_CI[i]), : no non-missing arguments to max;
## returning -Inf
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 11 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 11 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 12 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: Removed 11 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 11 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ggplot(ALL_data.df %>% filter(Sample == "BSC001",
Temp == 40) %>% #,
#Inoculum == "Stationary") %>%
filter(baselinedOD > 0.005,
baselinedOD < 0.5),
aes(x=baselinedOD, y=DNperCapita, colour=as.factor(Dilution))) +
geom_point(alpha=0.2) +
labs(title="BSC001 40C: 0.005 < OD < 0.5",
y="per capita Delta N") +
scale_y_continuous(limits = c(-0.1, 0.25)) +
geom_line(stat="smooth") +
geom_vline(xintercept = 0.05, linetype="dashed") # vertical line indicates TTD
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 24 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 24 rows containing missing values or values outside the scale range
## (`geom_point()`).
# I would like to fit the Lotka-Voltera assumed \mu - \alpha_ii*N line to the data. But in order to do that, we need to rationally decide where the cut-off will be on the x-axes
# Let's see how the mean value of DeltaN changes over time for each sample & temperature
test <- ALL_data.df %>% group_by(Sample, Temp, Time) %>%
summarise(mean_DNperCapita = mean(DNperCapita))
## `summarise()` has grouped output by 'Sample', 'Temp'. You can override using
## the `.groups` argument.
ggplot(test,
aes(x=Time, y=mean_DNperCapita, colour=as.factor(Temp))) +
geom_point(alpha=0.2)
## Warning: Removed 666 rows containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(test %>% filter(mean_DNperCapita < 1e+7, mean_DNperCapita > -1e+7),
aes(x=Time, y=mean_DNperCapita, colour=as.factor(Temp))) +
geom_point(alpha=0.2) +
labs(title="remove ridiculously large & small DNpercapita values")
ggplot(test %>% filter(mean_DNperCapita < 1e+7, mean_DNperCapita > -1e+7),
aes(x=Time, y=mean_DNperCapita, colour=as.factor(Temp))) +
geom_point(alpha=0.2) +
scale_y_log10() +
labs(title="remove ridiculously large & small DNpercapita values")
## Warning in transformation$transform(x): NaNs produced
## Warning in scale_y_log10(): log-10 transformation introduced infinite values.
## Warning: Removed 5053 rows containing missing values or values outside the scale range
## (`geom_point()`).
rm(test)
There’s too much noise in this shoddy derivatives data even to be
able to get a first approximation of how the density dependence changes
with temperature. (e.g., if we average the \(\frac{\Delta N}{N}\) across all replicates
for any one Sample + Temperature + Time, then we get values between -Inf
to +Inf. Even after we exclude some of these ridiculous values, there’s
still a lot of noise and mean growth rate can be as high as 0.05 even
after 50 hours…). We need a better way of de-noising the data before we
calculate the derivative: use gcplyr.
# redo the baselining to conform with the input for calc_deriv
tmp_blank <- ALL_data.df %>% ungroup() %>% group_by(uniqID) %>% summarise(blank = mean(medianBlankOD))
# smooth the data by taking the median then the average
# see https://mikeblazanin.github.io/gcplyr/articles/gc07_noise.html#combining-multiple-smoothing-methods
smoothed <- ALL_data.df %>% ungroup() %>%
mutate(smooth_med3 = smooth_data(x = Time,
y = OD,
subset_by = uniqID,
sm_method = "moving-median",
window_width_n = 3),
smoothOD = smooth_data(x = Time,
y = smooth_med3,
subset_by = uniqID,
sm_method = "moving-average",
window_width_n = 3),
percap_deriv = calc_deriv(y = smoothOD,
x = Time,
subset_by = uniqID,
percapita = TRUE,
blank = tmp_blank$blank,
window_width_n = 5))
# check to make sure the smoothing and derivative calculation worked to make the data less terrible:
ggplot(smoothed,
aes(x=Time, y=percap_deriv, colour=as.factor(Temp))) +
geom_point(alpha=0.2)
## Warning: Removed 17799 rows containing missing values or values outside the scale range
## (`geom_point()`).
# plot the same example as above
ggplot(smoothed %>% filter(uniqID == "E3 1 2023-11-20 Stationary"),
aes(x=baselinedOD, y=percap_deriv)) +
geom_point() +
labs(title="all N values (for same ex. as above)",
y="per capita derivative")
## Warning: Removed 8 rows containing missing values or values outside the scale range
## (`geom_point()`).
# plot a summary of all the data
for(sam in unique(smoothed$Sample)){
print(ggplot(smoothed %>% filter(Sample == sam) %>%
filter(baselinedOD > 0.02, # remove small OD values
percap_deriv > -0.1), # and any large negative derivative estimates
aes(x=baselinedOD,
y=percap_deriv,
colour=as.factor(Temp))) +
geom_point(alpha=0.03) +
geom_smooth(method="loess") +
labs(title=paste0(sam,": OD > 0.02 (loess smooth)"),
y="per capita derivative",
colour="*C"))
}
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
rm(tmp_blank, sam)
There seems to be a lot of information in this derivative plot. For example: see how all P. protegens samples accelerate their growth at intermediate densities before slowing down.
But we’re not interested in these details. We want a first order approximation for how the relationship between population size and per capita growth rate changes as a function of temperature. So we are going to stick with this simple linear relationship, where \(\alpha_{ii}\) is the slope, and we will see how this changes as a function of temperature. To do this, I will fit a 1st degree spline with just 1 knot to all replicates for one species at one temperature.
# select samples & temperatures with consistent growth as evidenced by estimates for OD_mu
# e.g., exclude most samples at 40*C
consistent_growth.df <- Dil_growthrates.df %>%
select(Sample, Temp, Inoculum, OD_mu) %>%
filter(!is.na(OD_mu)) %>%
select(-OD_mu) %>% distinct()
# initialize variable for storage
fitted_splines <- vector("list", length = nrow(consistent_growth.df))
# the possible locations for the spline knots
knot_spots <- seq(0.16, 0.5, by=0.005)
# loop through all the samples and temperatures
for(i in 1:nrow(consistent_growth.df)){
# get the sample & temperature
sam <- consistent_growth.df$Sample[i]
deg <- consistent_growth.df$Temp[i]
innoc <- consistent_growth.df$Inoculum[i]
# fit the 1st degree piecewise polynomial with just 1 knot. Do this for all possible knot locations
tryspline <- try(with(smoothed %>% filter(Sample == sam,
Temp == deg,
Inoculum == innoc,
baselinedOD > 0.02,
percap_deriv > -0.1),
lapply(knot_spots,
function(x) lm(percap_deriv ~ bs(baselinedOD, knots=c(x), degree=1))) ),
silent = TRUE)
# error handling: note down models which could not be fitted
if (class(tryspline) == "try-error") {
fitted_splines[[i]] <- list(sam, deg, rep(NA, 4), tryspline[1])
# error handling: when models could be fitted, save just the best one
} else if (class(tryspline) == "list"){
# use lowest BIC to decide which model is the best fit
best_BIC <- sapply(tryspline, BIC)
best_i <- which.min(best_BIC)
# get the model predictions for visualization
spline_pred <- data.frame(baselinedOD = seq(0.021, 0.8, length.out=30)) %>%
mutate(predicted = predict(tryspline[[best_i]], data.frame(baselinedOD)))
# plot the predictions on top of the data
print(ggplot(smoothed %>% filter(Sample == sam,
Temp == deg,
Inoculum == innoc,
baselinedOD > 0.02,
percap_deriv > -0.1),
aes(x=baselinedOD, y=percap_deriv, colour=as.factor(Dilution))) +
# plot the data as points
geom_point(alpha=0.2) +
# plot the predictions as a solid line
geom_line(data=spline_pred,
aes(x=baselinedOD, y=predicted), colour="black") +
labs(title=paste0(sam," ", deg, "*C: OD > 0.02"),
y="per capita derivative") +
# plot intrinsic growth rate estimates from the TTD as dashed lines
geom_hline(yintercept = Dil_growthrates.df$OD_mu[which(Dil_growthrates.df$Temp==deg & Dil_growthrates.df$Sample==sam)],
linetype="dashed"))
# fit the linear model to just the portion of the data estimated by the spline fit
trimmed_data <- smoothed %>% filter(Sample == sam,
Temp == deg,
Inoculum == innoc,
baselinedOD > 0.02,
# remove spurious estimates
percap_deriv > -0.1,
# keep values smaller than knot
baselinedOD < knot_spots[best_i])
line <- with(trimmed_data,
lm(percap_deriv ~ baselinedOD))
# finally summarize the carrying capacity as the median & IQR when per capita deriv is at 0
K <- smoothed %>% filter(Sample == sam,
Temp == deg,
Inoculum == innoc,
# keep values LARGER than knot
baselinedOD > knot_spots[best_i]) %>%
select(baselinedOD) %>% unlist() %>% quantile(probs = c(0.5, 0.25, 0.75))
# save the trimmed data, the linear model, its coefficients, and their confidence intervals to the storage variable
fitted_splines[[i]] <- list(Sample = sam, Temp = deg, Inoculum = innoc,
trimOD = knot_spots[best_i],
coef_LM = coef(line), CI_LM = confint(line),
model_LM = line, model_spline = tryspline[[best_i]],
data = trimmed_data, K = K)
}
# cleanup
rm(sam, deg, innoc, tryspline, best_i, best_BIC, spline_pred, line, trimmed_data, K)
}
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_hline()`).
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `predicted = predict(tryspline[[best_i]],
## data.frame(baselinedOD))`.
## Caused by warning in `bs()`:
## ! some 'x' values beyond boundary knots may cause ill-conditioned bases
# plot the data in the range relevant for the aii estimates
ggplot(smoothed %>% filter(baselinedOD > 0.02, # minimum baselined OD value
# maximum baselined OD value
baselinedOD < max(sapply(fitted_splines, function(x) x[[3]])),
percap_deriv > 0,
percap_deriv < 2.5),
aes(x=baselinedOD,
y=percap_deriv)) +
facet_wrap(vars(Temp)) +
geom_point(alpha=0.03, aes(colour=Species)) +
geom_smooth(method="lm", colour="black", se=FALSE) +
guides(colour = guide_legend(override.aes = list(alpha = 1))) +
labs(y="per capita derivative",
title="supralinear growth?")
## `geom_smooth()` using formula = 'y ~ x'
# summarize just the slope values and fix the format
aii <- sapply(fitted_splines, function(x) c(x$Sample, # sample
x$Inoculum,
x$Temp, # temperature
x$coef_LM, # intercept & slope
x$CI_LM[1,], # 95% CI on intercept
x$CI_LM[2,])) # 95% CI on slope
aii <- data.frame(t(aii))
colnames(aii) <- c("Sample", "Inoculum", "Temp", "Intercept", "Slope", "Intercept_CIlo", "Intercept_CIhi", "Slope_CIlo", "Slope_CIhi")
aii[,c(-1, -2)] <- sapply(aii[,c(-1, -2)], as.numeric) # change all but the first 2 columns into numeric
aii <- inner_join(aii,
Dil_growthrates.df %>% select(Sample, Species, Inoculum) %>% distinct())
## Joining with `by = join_by(Sample, Inoculum)`
# I want to add a line to indicate the temperature optimum
# For now, estimate the temperature optimum by directly looking at max of OD_mu
Tmax <- Dil_growthrates.df %>% group_by(Inoculum, Sample) %>%
summarise(max_mu = max(OD_mu, na.rm=TRUE))
## `summarise()` has grouped output by 'Inoculum'. You can override using the
## `.groups` argument.
Tmax <- Dil_growthrates.df[which(Dil_growthrates.df$OD_mu %in% Tmax$max_mu),] %>%
group_by(Species) %>%
summarise(Tmax = mean(Temp))
# plot to see the effect on the slope
ggplot(aii %>% inner_join(Tmax),
aes(x=Temp, y=Slope, colour=Sample)) +
facet_wrap(vars(Species)) +
geom_vline(aes(xintercept=Tmax), colour="lightgrey") +
geom_jitter(width=0.1, alpha=0.3) +
geom_errorbar(aes(ymin=Slope_CIlo, ymax=Slope_CIhi), width=0.1, alpha=0.5) +
theme(legend.position="none") +
labs(x="Temperature (*C)", y="a_ii estimate (+/- 95% CI)",
title="line shows empirical temperature optimum")
## Joining with `by = join_by(Species)`
# let's check for significance using emmeans (yes, I'm a fan of emmeans now that I know how to do it XD )
# create a data.frame with the trimmed data
spline_trimmmed_data <- lapply(fitted_splines, function(x) x$data) %>% bind_rows()
# make a column to indicate if the incubated temperature is lower, higher or equal to Tmax
spline_trimmmed_data <- inner_join(spline_trimmmed_data, Tmax) %>%
rename(empirical_thermal_optimum = Tmax) %>%
mutate(compare_to_Tmax = ifelse(Temp == empirical_thermal_optimum,
"equal",
ifelse(Temp < empirical_thermal_optimum, "lower", "higher")))
## Joining with `by = join_by(Species)`
# adjust the explanatory variables so that it's as expected by emmeans
spline_trimmmed_data$compare_to_Tmax <- factor(spline_trimmmed_data$compare_to_Tmax,
levels = c("lower", "higher", "equal"))
# compare some models
aheat_model0 <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax,
data = spline_trimmmed_data)
aheat_model1 <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax + Species,
data = spline_trimmmed_data)
aheat_model1m <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax + (1 | Species),
data = spline_trimmmed_data)
aheat_model2 <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax + Species + Dilution,
data = spline_trimmmed_data)
aheat_model2m <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax + (1 | Species + Dilution),
data = spline_trimmmed_data)
aheat_model3 <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax + Species*Inoculum,
data = spline_trimmmed_data)
aheat_model3m <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax + (1 | Species*Inoculum),
data = spline_trimmmed_data)
aheat_model4 <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax + Species*Dilution*Inoculum,
data = spline_trimmmed_data)
## Warning in finalizeTMB(TMBStruc, obj, fit, h, data.tmb.old): Model convergence
## problem; function evaluation limit reached without convergence (9). See
## vignette('troubleshooting'), help('diagnose')
aheat_model4m <- glmmTMB(percap_deriv ~ baselinedOD*compare_to_Tmax + (1 | Species*Dilution*Inoculum),
data = spline_trimmmed_data)
# this model doesn't converge
#aheat_model5m <- glmmTMB(percap_deriv ~ (baselinedOD*compare_to_Tmax | Species) + (1 | Dilution*Inoculum),
# data = spline_trimmmed_data)
AIC(aheat_model0, aheat_model1, aheat_model1m, aheat_model2, aheat_model2m,
aheat_model3, aheat_model3m, aheat_model4, aheat_model4m) %>% arrange(AIC)
BIC(aheat_model0, aheat_model1, aheat_model1m, aheat_model2, aheat_model2m,
aheat_model3, aheat_model3m, aheat_model4, aheat_model4m) %>% arrange(BIC)
# let's use model aheat_model4m
summary(aheat_model4m)
## Family: gaussian ( identity )
## Formula:
## percap_deriv ~ baselinedOD * compare_to_Tmax + (1 | Species *
## Dilution * Inoculum)
## Data: spline_trimmmed_data
##
## AIC BIC logLik deviance df.resid
## 16504.7 16632.4 -8238.3 16476.7 67667
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## Species (Intercept) 1.051e-02 0.1025289
## Dilution (Intercept) 2.503e-04 0.0158219
## Inoculum (Intercept) 3.312e-10 0.0000182
## Species:Dilution (Intercept) 5.485e-04 0.0234208
## Species:Inoculum (Intercept) 9.406e-04 0.0306694
## Dilution:Inoculum (Intercept) 4.571e-04 0.0213810
## Species:Dilution:Inoculum (Intercept) 1.432e-03 0.0378472
## Residual 7.440e-02 0.2727656
## Number of obs: 67681, groups:
## Species, 6; Dilution, 6; Inoculum, 2; Species:Dilution, 36; Species:Inoculum, 12; Dilution:Inoculum, 12; Species:Dilution:Inoculum, 72
##
## Dispersion estimate for gaussian family (sigma^2): 0.0744
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.963903 0.044203 21.81 <2e-16 ***
## baselinedOD -2.322444 0.010249 -226.61 <2e-16 ***
## compare_to_Tmaxhigher -0.247233 0.005274 -46.88 <2e-16 ***
## compare_to_Tmaxequal 0.193064 0.004992 38.67 <2e-16 ***
## baselinedOD:compare_to_Tmaxhigher 0.242774 0.024097 10.07 <2e-16 ***
## baselinedOD:compare_to_Tmaxequal -0.467510 0.019223 -24.32 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# we can check the significance of the fixed effects:
joint_tests(aheat_model4m)
# clean up the models we won't be using anymore
rm(aheat_model0, aheat_model1, aheat_model1m, aheat_model2, aheat_model2m, aheat_model3, aheat_model3m, aheat_model4)
# get the effect size
emm_aheat <- emmeans(aheat_model4m,
~ compare_to_Tmax | baselinedOD,
data = spline_trimmmed_data)
effect_aheat <- eff_size(emm_aheat, sigma(aheat_model4m), edf = df.residual(aheat_model4m))
# posthoc to get the p-values
pvals <- emmeans(emm_aheat, pairwise ~ compare_to_Tmax | baselinedOD)
print(pvals)
## $emmeans
## baselinedOD = 0.215:
## compare_to_Tmax emmean SE df lower.CL upper.CL
## lower 0.464 0.0441 67667 0.378 0.551
## higher 0.269 0.0442 67667 0.183 0.356
## equal 0.557 0.0442 67667 0.470 0.643
##
## Confidence level used: 0.95
##
## $contrasts
## baselinedOD = 0.215:
## contrast estimate SE df t.ratio p.value
## lower - higher 0.1950 0.00307 67667 63.583 <.0001
## lower - equal -0.0925 0.00263 67667 -35.110 <.0001
## higher - equal -0.2875 0.00351 67667 -81.800 <.0001
##
## P value adjustment: tukey method for comparing a family of 3 estimates
# finally, we can report the improvement in fit that is attributable to compare_to_Tmax by comparing R^2 with a simpler model
aheat_REDUCEDmodel <- glmmTMB(percap_deriv ~ baselinedOD + (1 | Species*Dilution*Inoculum),
data = spline_trimmmed_data)
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in finalizeTMB(TMBStruc, obj, fit, h, data.tmb.old): Model convergence
## problem; non-positive-definite Hessian matrix. See vignette('troubleshooting')
## Warning in finalizeTMB(TMBStruc, obj, fit, h, data.tmb.old): Model convergence
## problem; false convergence (8). See vignette('troubleshooting'),
## help('diagnose')
## IT'S NOT POSSIBLE TO FIT THE MODEL CUZ IT WON'T CONVERGE!!
## This can probably be trouble-shooted but it's not that important for me...
# clean up
rm(aheat_REDUCEDmodel)
# extract the confidence intervals from the effect size
heat_effect <- data.frame(contrast = c("lower than Tmax", "higher than Tmax"),
eff_est = confint(effect_aheat)[[3]][-1],
eff_loCI = confint(effect_aheat)[[6]][-1],
eff_hiCI = confint(effect_aheat)[[7]][-1])
heat_effect$contrast <- factor(heat_effect$contrast,
levels = c("lower than Tmax", "higher than Tmax"))
ggplot(heat_effect,
aes(x = eff_est, y = contrast)) +
geom_vline(xintercept = 0, colour="darkgrey") +
geom_point() +
geom_errorbarh(aes(xmin = eff_loCI, xmax = eff_hiCI), height = 0.1) +
labs(x = "Effect size on a_ii estimate",
y = "Incubated temperature")
print(pvals)
## $emmeans
## baselinedOD = 0.215:
## compare_to_Tmax emmean SE df lower.CL upper.CL
## lower 0.464 0.0441 67667 0.378 0.551
## higher 0.269 0.0442 67667 0.183 0.356
## equal 0.557 0.0442 67667 0.470 0.643
##
## Confidence level used: 0.95
##
## $contrasts
## baselinedOD = 0.215:
## contrast estimate SE df t.ratio p.value
## lower - higher 0.1950 0.00307 67667 63.583 <.0001
## lower - equal -0.0925 0.00263 67667 -35.110 <.0001
## higher - equal -0.2875 0.00351 67667 -81.800 <.0001
##
## P value adjustment: tukey method for comparing a family of 3 estimates
# finally, let's plot the a_ii proxy against mu estimated from TTD and also against carrying capacity
growth_traits.df <- full_join(Dil_growthrates.df %>%
select(Sample, Temp, Species, Inoculum,
OD_mu, OD_mu_lo_CI, OD_mu_hi_CI) %>%
rename(mu_TTDcalibrated = OD_mu,
mu_loCI = OD_mu_lo_CI,
mu_hiCI = OD_mu_hi_CI),
aii %>%
select(Sample, Temp, Species, Inoculum,
Slope, Slope_CIlo, Slope_CIhi) %>%
rename(aii_mean = Slope,
aii_loCI = Slope_CIlo,
aii_hiCI = Slope_CIhi),
by = c("Sample", "Temp", "Species", "Inoculum"))
# coerce the carrying capacity from the fitted_splines list into a data.frame
carrying_cap <- sapply(fitted_splines, function(x) c(x$Sample, x$Inoculum, x$Temp, x$K))
carrying_cap <- data.frame(t(carrying_cap))
colnames(carrying_cap) <- c("Sample", "Inoculum", "Temp", "K_median", "K_loIQR", "K_hiIQR")
carrying_cap[,c(-1, -2)] <- sapply(carrying_cap[,c(-1, -2)], as.numeric) # change all but the first 2 columns into numeric
# combine the K data with the rest of the growth traits
growth_traits.df <- full_join(growth_traits.df,
carrying_cap,
by = c("Sample", "Temp", "Inoculum"))
# plot mu versus alpha_ii
ggplot(growth_traits.df,
aes(x = mu_TTDcalibrated, y = aii_mean, colour = Species)) +
facet_wrap(vars(Temp)) +
geom_point(alpha = 0.4)
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(growth_traits.df,
aes(x = mu_TTDcalibrated, y = aii_mean, colour = Species)) +
facet_wrap(vars(Temp)) +
geom_linerange(aes(ymin = aii_loCI, ymax = aii_hiCI), alpha=0.4) +
geom_errorbarh(aes(xmin = mu_loCI, xmax = mu_hiCI), height=0, alpha=0.4) +
geom_point(alpha = 0.4)
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_segment()`).
## Warning: Removed 18 rows containing missing values or values outside the scale range
## (`geom_segment()`).
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_errorbarh()`).
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_point()`).
# check for a correlation between \mu and \a_ii
aii_vs_mu_model <- glmmTMB(aii_mean ~ mu_TTDcalibrated + as.factor(Temp) + (1 | Species),
data = growth_traits.df)
aii_vs_mu_model2 <- glmmTMB(aii_mean ~ mu_TTDcalibrated + (1 | Species * Temp),
data = growth_traits.df)
aii_vs_mu_model3 <- glmmTMB(aii_mean ~ mu_TTDcalibrated*Species + (1 | Temp),
data = growth_traits.df)
aii_vs_mu_model4 <- glmmTMB(aii_mean ~ mu_TTDcalibrated*as.factor(Temp) + (1 | Species),
data = growth_traits.df)
# check which is best one
AIC(aii_vs_mu_model, aii_vs_mu_model2, aii_vs_mu_model3, aii_vs_mu_model4) %>% arrange(AIC)
BIC(aii_vs_mu_model, aii_vs_mu_model2, aii_vs_mu_model3, aii_vs_mu_model4) %>% arrange(BIC)
# cleanup
rm(aii_vs_mu_model2, aii_vs_mu_model3, aii_vs_mu_model3, aii_vs_mu_model4)
## Warning in rm(aii_vs_mu_model2, aii_vs_mu_model3, aii_vs_mu_model3,
## aii_vs_mu_model4): object 'aii_vs_mu_model3' not found
# this is the best model
summary(aii_vs_mu_model)
## Family: gaussian ( identity )
## Formula: aii_mean ~ mu_TTDcalibrated + as.factor(Temp) + (1 | Species)
## Data: growth_traits.df
##
## AIC BIC logLik deviance df.resid
## 246.2 265.1 -116.1 232.2 102
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## Species (Intercept) 0.04176 0.2043
## Residual 0.46954 0.6852
## Number of obs: 109, groups: Species, 6
##
## Dispersion estimate for gaussian family (sigma^2): 0.47
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.36281 0.31334 1.158 0.2469
## mu_TTDcalibrated -3.51828 0.35625 -9.876 < 2e-16 ***
## as.factor(Temp)30 -0.09284 0.18333 -0.506 0.6126
## as.factor(Temp)35 -0.42609 0.18235 -2.337 0.0195 *
## as.factor(Temp)40 -1.50763 0.27615 -5.459 4.78e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# we can check for significance of the fixed effects:
joint_tests(aii_vs_mu_model)
# finally, we can report the improvement in fit that is attributable to mu by comparing R^2 with a simpler model
aii_vs_mu_REDUCEDmodel <- glmmTMB(aii_mean ~ as.factor(Temp) + (1 | Species),
data = growth_traits.df)
AIC(aii_vs_mu_REDUCEDmodel, aii_vs_mu_model) %>% arrange(AIC)
BIC(aii_vs_mu_REDUCEDmodel, aii_vs_mu_model) %>% arrange(BIC)
# Calculate R-squared values
full_r2 <- r2_nakagawa(aii_vs_mu_model)
reduced_r2 <- r2_nakagawa(aii_vs_mu_REDUCEDmodel)
# Calculate the explained variance by x
expl_var_aiiVSmu <- full_r2$R2_conditional - reduced_r2$R2_conditional
print(paste0("mu is a significant & preferred explanatory variable, although it only explains ", round(100*expl_var_aiiVSmu, digits=1), "% of the variance"))
## [1] "mu is a significant & preferred explanatory variable, although it only explains 12.5% of the variance"
# clean up
rm(aii_vs_mu_REDUCEDmodel, full_r2, reduced_r2)
# plot K versus alpha_ii
ggplot(growth_traits.df,
aes(x = K_median, y = aii_mean, colour = Species)) +
facet_wrap(vars(Temp)) +
geom_point(alpha = 0.4)
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_point()`).
# check for a correlation between K and \a_ii
aii_vs_K_model <- glmmTMB(aii_mean ~ K_median + as.factor(Temp) + (1 | Species),
data = growth_traits.df)
aii_vs_K_model2 <- glmmTMB(aii_mean ~ K_median + (1 | Species * Temp),
data = growth_traits.df)
aii_vs_K_model3 <- glmmTMB(aii_mean ~ K_median*Species + (1 | Temp),
data = growth_traits.df)
aii_vs_K_model4 <- glmmTMB(aii_mean ~ K_median*as.factor(Temp) + (1 | Species),
data = growth_traits.df)
# check which is best one
AIC(aii_vs_K_model, aii_vs_K_model2, aii_vs_K_model3, aii_vs_K_model4) %>% arrange(AIC)
BIC(aii_vs_K_model, aii_vs_K_model2, aii_vs_K_model3, aii_vs_K_model4) %>% arrange(BIC)
# cleanup
rm(aii_vs_K_model, aii_vs_K_model3, aii_vs_K_model4)
# this is the best model
summary(aii_vs_K_model2)
## Family: gaussian ( identity )
## Formula: aii_mean ~ K_median + (1 | Species * Temp)
## Data: growth_traits.df
##
## AIC BIC logLik deviance df.resid
## 263.1 279.2 -125.5 251.1 103
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## Species (Intercept) 0.45157 0.6720
## Temp (Intercept) 0.04401 0.2098
## Species:Temp (Intercept) 0.58039 0.7618
## Residual 0.36920 0.6076
## Number of obs: 109, groups: Species, 6; Temp, 4; Species:Temp, 20
##
## Dispersion estimate for gaussian family (sigma^2): 0.369
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.6874 0.6090 -2.771 0.00559 **
## K_median -1.5620 0.7928 -1.970 0.04881 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# we can check for significance of the fixed effects:
joint_tests(aii_vs_K_model2) # note that K is *not* significant
# finally, we can report the improvement in fit that is attributable to mu by comparing R^2 with a simpler model
aii_vs_K_REDUCEDmodel <- glmmTMB(aii_mean ~ (1 | Species * Temp),
data = growth_traits.df)
AIC(aii_vs_K_model2, aii_vs_K_REDUCEDmodel) %>% arrange(AIC)
BIC(aii_vs_K_model2, aii_vs_K_REDUCEDmodel) %>% arrange(BIC)
# these AIC & BIC values are suuuper similar. Let's check if the models are different:
anova(aii_vs_K_REDUCEDmodel, aii_vs_K_model2)
# Calculate R-squared values
full_r2 <- r2_nakagawa(aii_vs_K_model2)
reduced_r2 <- r2_nakagawa(aii_vs_K_REDUCEDmodel)
# Calculate the explained variance by x
expl_var_aiiVSK <- abs(full_r2$R2_conditional - reduced_r2$R2_conditional)
print(paste0("K is not significant. It only explains ", round(100*expl_var_aiiVSK, digits=1), "% of the variance in a_ii."))
## [1] "K is not significant. It only explains 1.7% of the variance in a_ii."
# clean up
rm(aii_vs_K_REDUCEDmodel, full_r2, reduced_r2)
ggplot(growth_traits.df,
aes(x = K_median, y = aii_mean, colour = Species)) +
facet_wrap(vars(Temp)) +
geom_errorbar(aes(ymin = aii_loCI, ymax = aii_hiCI), width=0.01, alpha=0.4) +
geom_errorbarh(aes(xmin = K_loIQR, xmax = K_hiIQR), width=0.01, alpha=0.4) +
geom_point(alpha = 0.4)
## Warning in geom_errorbarh(aes(xmin = K_loIQR, xmax = K_hiIQR), width = 0.01, :
## Ignoring unknown parameters: `width`
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_errorbarh()`).
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_point()`).
# plot mu versus K (for completeness)
ggplot(growth_traits.df,
aes(x = mu_TTDcalibrated, y = K_median, colour = Species)) +
facet_wrap(vars(Temp)) +
geom_point(alpha = 0.4)
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_point()`).
ggplot(growth_traits.df,
aes(x = mu_TTDcalibrated, y = K_median, colour = Species)) +
facet_wrap(vars(Temp)) +
geom_errorbar(aes(ymin = K_loIQR, ymax = K_hiIQR), width=0.01, alpha=0.4) +
geom_errorbarh(aes(xmin = mu_loCI, xmax = mu_hiCI), width=0.01, alpha=0.4) +
geom_point(alpha = 0.4)
## Warning in geom_errorbarh(aes(xmin = mu_loCI, xmax = mu_hiCI), width = 0.01, :
## Ignoring unknown parameters: `width`
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_errorbarh()`).
## Warning: Removed 19 rows containing missing values or values outside the scale range
## (`geom_point()`).
# check for a correlation between K and \a_ii
mu_vs_K_model <- glmmTMB(mu_TTDcalibrated ~ K_median + as.factor(Temp) + (1 | Species),
data = growth_traits.df)
mu_vs_K_model2 <- glmmTMB(mu_TTDcalibrated ~ K_median + (1 | Species * Temp),
data = growth_traits.df)
mu_vs_K_model3 <- glmmTMB(mu_TTDcalibrated ~ K_median*Species + (1 | Temp),
data = growth_traits.df)
mu_vs_K_model4 <- glmmTMB(mu_TTDcalibrated ~ K_median*as.factor(Temp) + (1 | Species),
data = growth_traits.df)
# check which is best one
AIC(mu_vs_K_model, mu_vs_K_model2, mu_vs_K_model3, mu_vs_K_model4) %>% arrange(AIC)
BIC(mu_vs_K_model, mu_vs_K_model2, mu_vs_K_model3, mu_vs_K_model4) %>% arrange(BIC)
# cleanup
rm(mu_vs_K_model, mu_vs_K_model3, mu_vs_K_model4)
# this is the best model
summary(mu_vs_K_model2)
## Family: gaussian ( identity )
## Formula: mu_TTDcalibrated ~ K_median + (1 | Species * Temp)
## Data: growth_traits.df
##
## AIC BIC logLik deviance df.resid
## -276.6 -260.5 144.3 -288.6 103
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## Species (Intercept) 3.372e-03 5.807e-02
## Temp (Intercept) 9.139e-10 3.023e-05
## Species:Temp (Intercept) 8.147e-02 2.854e-01
## Residual 1.494e-03 3.866e-02
## Number of obs: 109, groups: Species, 6; Temp, 4; Species:Temp, 20
##
## Dispersion estimate for gaussian family (sigma^2): 0.00149
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.75188 0.07607 9.885 <2e-16 ***
## K_median 0.02471 0.05247 0.471 0.638
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# we can check for significance of the fixed effects:
joint_tests(mu_vs_K_model2) # note that K is *not* significant
# finally, we can report the improvement in fit that is attributable to mu by comparing R^2 with a simpler model
mu_vs_K_REDUCEDmodel <- glmmTMB(mu_TTDcalibrated ~ (1 | Species * Temp),
data = growth_traits.df)
AIC(mu_vs_K_model2, mu_vs_K_REDUCEDmodel) %>% arrange(AIC)
BIC(mu_vs_K_model2, mu_vs_K_REDUCEDmodel) %>% arrange(BIC)
# these AIC & BIC values are suuuper similar. Let's check if the models are different:
anova(mu_vs_K_REDUCEDmodel, mu_vs_K_model2)
# clean up
rm(aii_vs_K_REDUCEDmodel)
## Warning in rm(aii_vs_K_REDUCEDmodel): object 'aii_vs_K_REDUCEDmodel' not found
There is a significant interaction between the \(\alpha_{ii}\) and the thermal “optimum” (here defined as the temperature with the largest observed \(\mu\) as estimated from the TTD data). It seems that \(\alpha_{ii}\) is strongest at the thermal optimum and lower for temperature both below and above the optimum.
Finally, \(\alpha_{ii}\) is negatively correlated with the growth rate but not the carrying capacity. (Growth rate and carrying capacity are uncorrelated, which is reassuring.)
(just for satisfying my curiosity, it might be nice to compare the TTD vs _max growth rate estimates…)